我正在尝试进行一个sql查询,该查询中我要计算三个范围内的人数:
Tomorrow (from 06:00 a.m. to 12:00 p.m.)
Afternoon (from 12:00 p.m. to 9:00 p.m.)
Night (from 9:00 p.m. to 6:00 a.m.)
我有两个属性,签入时间和签出时间,它们具有以下格式:
2020-05-20 12:10:29.000
我正在通过以下方式执行此操作,但例如在夜间,它不起作用:
select (case when datepart(hour, dateIn) > datepart(hour, '21')) and
datepart(minute, dateIn) > datepart(minute, '00'))
答案 0 :(得分:1)
如果我的理解正确,您可以减去6个小时以获得日期,然后使用时间比较进行轮班。所以,我想你想要
select convert(date, dateadd(hour, -6, t.datein)), v.shift, count(*)
from t cross apply
(values (case when convert(time, t.datein) < '06:00:00' then 'night'
when convert(time, t.datein) < '12:00:00' then 'morning'
when convert(time, t.datein) < '21:00:00' then 'afternoon'
else 'night'
end)
) v(shift)
group by convert(date, dateadd(hour, -6, datein)), v.shift;