一个关于时间的sql语句

在别的论坛看到这么一个关于计算时间的sqlserver的题...


我有一些时间段,怎么能计算出去重复的总时间,比如
a                         b
9:00:00                   10:00:00
8:00:00                   9:30:00
11:00:00                  12:00:00
结果应该是3小时,如果把时间段查出来在外面计算太慢了,能不能直接在SQL里面算好


--代码如下

with tb(a,b)as(
select '2001-01-01 6:00:00','2001-01-01 7:00:00' union
select '2001-01-01 9:00:00','2001-01-01 10:00:00' union
select '2001-01-01 8:00:00','2001-01-01 9:30:00' union
select '2001-01-01 8:00:00','2001-01-01 10:30:00' union
select '2001-01-01 11:00:00','2001-01-01 12:00:00'),tc as(
select CONVERT(datetime,a)a,CONVERT(datetime,b)b,ROW_NUMBER() over(order by convert(datetime,a),convert(datetime,b))num from tb
),td as(
select * from tc where num=1
union all
select case when tc.a between td.a and td.b then td.a else tc.a end
,case when tc.a between td.a and td.b then case when  tc.b>td.b then tc.b else td.b end else tc.b end,tc.num 
from td,tc where td.num=tc.num-1)
select a,max(b)b from td
group by a

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值