代码如下,这段是精确到秒的,如果要精确到分钟,那就改“13:13:13”为“13:13:00”,“14:46:12”为“14:46:00”。 select BeginTime, case when '13:13:13' between BeginTime and EndTime then round(convert(float, CONVERT(datetime, EndTime) - CONVERT(datetime, '13:13:13') + 1.0000 / 60 / 60 / 24) * 24 * 60, 2) when '14:46:12' between BeginTime and EndTime then round(convert(float, CONVERT(datetime, '14:46:12') - CONVERT(datetime, BeginTime)) * 24 * 60, 2) End from ( select '00:00:00' BeginTime, '00:59:59' EndTime union all select '01:00:00' BeginTime, '01:59:59' EndTime union all select '02:00:00' BeginTime, '02:59:59' EndTime union all select '03:00:00' BeginTime, '03:59:59' EndTime union all select '04:00:00' BeginTime, '04:59:59' EndTime union all select '05:00:00' BeginTime, '05:59:59' EndTime union all select '06:00:00' BeginTime, '06:59:59' EndTime union all select '07:00:00' BeginTime, '07:59:59' EndTime union all select '08:00:00' BeginTime, '08:59:59' EndTime union all select '09:00:00' BeginTime, '09:59:59' EndTime union all select '10:00:00' BeginTime, '10:59:59' EndTime union all select '11:00:00' BeginTime, '11:59:59' EndTime union all select '12:00:00' BeginTime, '12:59:59' EndTime union all select '13:00:00' BeginTime, '13:59:59' EndTime union all select '14:00:00' BeginTime, '14:59:59' EndTime union all select '15:00:00' BeginTime, '15:59:59' EndTime union all select '16:00:00' BeginTime, '16:59:59' EndTime union all select '17:00:00' BeginTime, '17:59:59' EndTime union all select '18:00:00' BeginTime, '18:59:59' EndTime union all select '19:00:00' BeginTime, '19:59:59' EndTime union all select '20:00:00' BeginTime, '20:59:59' EndTime union all select '21:00:00' BeginTime, '21:59:59' EndTime union all select '22:00:00' BeginTime, '22:59:59' EndTime union all select '23:00:00' BeginTime, '23:59:59' EndTime ) aa where BeginTime <'14:46:12' and EndTime>'13:13:13'
噢,代码改了一下,忘记判断整小时的情况了。 select BeginTime, case when '03:13:13' between BeginTime and EndTime then round(convert(float, CONVERT(datetime, EndTime) - CONVERT(datetime, '03:13:13') + 1.0000 / 60 / 60 / 24) * 24 * 60, 2) when '14:46:12' between BeginTime and EndTime then round(convert(float, CONVERT(datetime, '14:46:12') - CONVERT(datetime, BeginTime)) * 24 * 60, 2) else 60 End from ( select '00:00:00' BeginTime, '00:59:59' EndTime union all select '01:00:00' BeginTime, '01:59:59' EndTime union all select '02:00:00' BeginTime, '02:59:59' EndTime union all select '03:00:00' BeginTime, '03:59:59' EndTime union all select '04:00:00' BeginTime, '04:59:59' EndTime union all select '05:00:00' BeginTime, '05:59:59' EndTime union all select '06:00:00' BeginTime, '06:59:59' EndTime union all select '07:00:00' BeginTime, '07:59:59' EndTime union all select '08:00:00' BeginTime, '08:59:59' EndTime union all select '09:00:00' BeginTime, '09:59:59' EndTime union all select '10:00:00' BeginTime, '10:59:59' EndTime union all select '11:00:00' BeginTime, '11:59:59' EndTime union all select '12:00:00' BeginTime, '12:59:59' EndTime union all select '13:00:00' BeginTime, '13:59:59' EndTime union all select '14:00:00' BeginTime, '14:59:59' EndTime union all select '15:00:00' BeginTime, '15:59:59' EndTime union all select '16:00:00' BeginTime, '16:59:59' EndTime union all select '17:00:00' BeginTime, '17:59:59' EndTime union all select '18:00:00' BeginTime, '18:59:59' EndTime union all select '19:00:00' BeginTime, '19:59:59' EndTime union all select '20:00:00' BeginTime, '20:59:59' EndTime union all select '21:00:00' BeginTime, '21:59:59' EndTime union all select '22:00:00' BeginTime, '22:59:59' EndTime union all select '23:00:00' BeginTime, '23:59:59' EndTime ) aa where BeginTime <'14:46:12' and EndTime>'03:13:13'
;WITH CTE AS( SELECT CONVERT(VARCHAR(13),登陆时间,120)+':00:00' Point ,* FROM TB ) ,CTE2 AS( SELECT CASE WHEN T1.登陆时间>DATEADD(HOUR,T2.number,T1.Point)THEN T1.登陆时间 ELSE DATEADD(HOUR,T2.number,T1.Point) END StartTime ,CASE WHEN T1.退出时间<DATEADD(HOUR,T2.number+1,T1.Point)THEN T1.退出时间 ELSE DATEADD(HOUR,T2.number+1,T1.Point) END EndTime FROM CTE T1 JOIN master..spt_values T2 ON T2.type='P'AND T2.number<=DATEDIFF(HOUR,T1.登陆时间,T1.退出时间) ) SELECT DATEPART(HOUR,StartTime)时间段 ,DATEDIFF(MINUTE,StartTime,EndTime)业务使用情况 FROM CTE2登陆时间 退出时间需要是时间类型
select
BeginTime,
case
when '13:13:13' between BeginTime and EndTime then round(convert(float, CONVERT(datetime, EndTime) - CONVERT(datetime, '13:13:13') + 1.0000 / 60 / 60 / 24) * 24 * 60, 2)
when '14:46:12' between BeginTime and EndTime then round(convert(float, CONVERT(datetime, '14:46:12') - CONVERT(datetime, BeginTime)) * 24 * 60, 2)
End
from
(
select '00:00:00' BeginTime, '00:59:59' EndTime
union all
select '01:00:00' BeginTime, '01:59:59' EndTime
union all
select '02:00:00' BeginTime, '02:59:59' EndTime
union all
select '03:00:00' BeginTime, '03:59:59' EndTime
union all
select '04:00:00' BeginTime, '04:59:59' EndTime
union all
select '05:00:00' BeginTime, '05:59:59' EndTime
union all
select '06:00:00' BeginTime, '06:59:59' EndTime
union all
select '07:00:00' BeginTime, '07:59:59' EndTime
union all
select '08:00:00' BeginTime, '08:59:59' EndTime
union all
select '09:00:00' BeginTime, '09:59:59' EndTime
union all
select '10:00:00' BeginTime, '10:59:59' EndTime
union all
select '11:00:00' BeginTime, '11:59:59' EndTime
union all
select '12:00:00' BeginTime, '12:59:59' EndTime
union all
select '13:00:00' BeginTime, '13:59:59' EndTime
union all
select '14:00:00' BeginTime, '14:59:59' EndTime
union all
select '15:00:00' BeginTime, '15:59:59' EndTime
union all
select '16:00:00' BeginTime, '16:59:59' EndTime
union all
select '17:00:00' BeginTime, '17:59:59' EndTime
union all
select '18:00:00' BeginTime, '18:59:59' EndTime
union all
select '19:00:00' BeginTime, '19:59:59' EndTime
union all
select '20:00:00' BeginTime, '20:59:59' EndTime
union all
select '21:00:00' BeginTime, '21:59:59' EndTime
union all
select '22:00:00' BeginTime, '22:59:59' EndTime
union all
select '23:00:00' BeginTime, '23:59:59' EndTime
) aa
where BeginTime <'14:46:12' and EndTime>'13:13:13'
select
BeginTime,
case
when '03:13:13' between BeginTime and EndTime then round(convert(float, CONVERT(datetime, EndTime) - CONVERT(datetime, '03:13:13') + 1.0000 / 60 / 60 / 24) * 24 * 60, 2)
when '14:46:12' between BeginTime and EndTime then round(convert(float, CONVERT(datetime, '14:46:12') - CONVERT(datetime, BeginTime)) * 24 * 60, 2)
else 60
End
from
(
select '00:00:00' BeginTime, '00:59:59' EndTime
union all
select '01:00:00' BeginTime, '01:59:59' EndTime
union all
select '02:00:00' BeginTime, '02:59:59' EndTime
union all
select '03:00:00' BeginTime, '03:59:59' EndTime
union all
select '04:00:00' BeginTime, '04:59:59' EndTime
union all
select '05:00:00' BeginTime, '05:59:59' EndTime
union all
select '06:00:00' BeginTime, '06:59:59' EndTime
union all
select '07:00:00' BeginTime, '07:59:59' EndTime
union all
select '08:00:00' BeginTime, '08:59:59' EndTime
union all
select '09:00:00' BeginTime, '09:59:59' EndTime
union all
select '10:00:00' BeginTime, '10:59:59' EndTime
union all
select '11:00:00' BeginTime, '11:59:59' EndTime
union all
select '12:00:00' BeginTime, '12:59:59' EndTime
union all
select '13:00:00' BeginTime, '13:59:59' EndTime
union all
select '14:00:00' BeginTime, '14:59:59' EndTime
union all
select '15:00:00' BeginTime, '15:59:59' EndTime
union all
select '16:00:00' BeginTime, '16:59:59' EndTime
union all
select '17:00:00' BeginTime, '17:59:59' EndTime
union all
select '18:00:00' BeginTime, '18:59:59' EndTime
union all
select '19:00:00' BeginTime, '19:59:59' EndTime
union all
select '20:00:00' BeginTime, '20:59:59' EndTime
union all
select '21:00:00' BeginTime, '21:59:59' EndTime
union all
select '22:00:00' BeginTime, '22:59:59' EndTime
union all
select '23:00:00' BeginTime, '23:59:59' EndTime
) aa
where BeginTime <'14:46:12' and EndTime>'03:13:13'
SELECT CONVERT(VARCHAR(13),登陆时间,120)+':00:00' Point
,*
FROM TB
)
,CTE2 AS(
SELECT CASE WHEN T1.登陆时间>DATEADD(HOUR,T2.number,T1.Point)THEN T1.登陆时间 ELSE DATEADD(HOUR,T2.number,T1.Point) END StartTime
,CASE WHEN T1.退出时间<DATEADD(HOUR,T2.number+1,T1.Point)THEN T1.退出时间 ELSE DATEADD(HOUR,T2.number+1,T1.Point) END EndTime
FROM CTE T1
JOIN master..spt_values T2 ON T2.type='P'AND T2.number<=DATEDIFF(HOUR,T1.登陆时间,T1.退出时间)
)
SELECT DATEPART(HOUR,StartTime)时间段
,DATEDIFF(MINUTE,StartTime,EndTime)业务使用情况
FROM CTE2登陆时间 退出时间需要是时间类型