日期:2014-05-18  浏览次数:20697 次

sql排除时间段的问题!
有一列火车从北京开往广州,发车时间是5.1号上午7:00,到新疆的时候是5.4号晚上23:30,条件:每天晚上23:00到第二天早上08:00的时

间不统计,就是跨天之后统计出的时间要排除上午08:00到晚上23:00这个时间段,统计出这列火车的运行时长!
例:
运行时长就是:   5.1号的上午08:00之后计算到5.1晚上的23:00整,5.1的运行时间就是:15个小时,因为要满足条件,
                              5.2号的运行时间就是上午08:00到晚上23:00   也是只有15个小时,因为要满足条件,  
                              5.3号的运行时长是上午08:00到晚上23:00   也是只有15个小时,因为要满足条件,
                              5.4号的运行时长是上午08:00到晚上23:00   也是只有15个小时,23:30只统计到23:00,也就是只有15个小时,因为要满足条件
                              总时长就是60个小时
设开车时间是X,到站时间为Y,请用表达统计这个时间段!X和Y是随意的。
能用SQL语句写出来不?万分感谢!



------解决方案--------------------
--前提,必须跨日.

declare @dt2 as datetime
set @dt1 = '2007-05-01 07:00:00 '
set @dt2 = '2007-05-04 23:30:00 '

select
case when right(convert(varchar(13),@dt1,120),2) < '08 ' then 15 else 23 - cast(right(convert(varchar(13),@dt1,120),2) as int) end +
(datediff(day,@dt1,@dt2) - 1) * 15 +
case when right(convert(varchar(13),@dt2,120),2) > '23 ' then 15 else cast(right(convert(varchar(13),@dt2,120),2) as int) - 8 end
总时长

/*
总时长
-----------
60

(所影响的行数为 1 行)
*/