我有以下问题,我必须将不同的交易分组到时间段。假设您有一个包含条目datetimestamp的记录的表。这些记录由不同班次的用户(操作员)创建
转移1 :5 - 13h // Shift 2 :13 - 21h // Shift 3 :21 - 5h
现在我想要一个灵活的查询,将时间戳舍入到班次的开始时间。例如:
2010-09-08 06:12:00.000 --> 2010-09-08 05:00:00.000
2010-09-08 02:12:00.000 --> 2010-09-07 21:00:00.000
我已经尝试过使用dateadd和datediff进行一些查询但是我没有让它工作......有人可以帮忙吗?感谢
答案 0 :(得分:1)
select
case
when datepart(hh, start_date) between 5 and 12
then dateadd(hh, 5, dateadd(d, datediff(d, 0, start_date), 0))
when datepart(hh, start_date) between 13 and 20
then dateadd(hh, 13, dateadd(d, datediff(d, 0, start_date), 0))
when datepart(hh, start_date) between 21 and 23
then dateadd(hh, 21, dateadd(d, datediff(d, 0, start_date), 0))
else dateadd(hh, 21, dateadd(d, datediff(d, 0, start_date)-1, 0))
end
from ...
答案 1 :(得分:0)
select
case
--shift I
when datepart(HH, [TimeStamp]) >= 5 and datepart(HH, [TimeStamp]) < 13 then
dateadd(HH, 5, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
--shift II
when datepart(HH, [TimeStamp]) >= 13 and datepart(HH, [TimeStamp]) < 21 then
dateadd(HH, 13, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
--shift III
when datepart(HH, [TimeStamp]) >= 21 then
dateadd(HH, 21, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
when datepart(HH, [TimeStamp]) < 5 then
dateadd(HH, 21, dateadd(dd,0, datediff(dd,0,[TimeStamp])-1))
end as StartTime
from
Table1
答案 2 :(得分:0)
如果您的数据库支持INTERVAL
类型,请从事件的时间戳中减去五个小时,将其相对于午夜而不是0500排成一行,并将时间部分除以八小时,以获得从零开始索引的班次编号。 / p>
要获得班次开始时间,请将班次乘以8小时,将其添加到您上面所做的减法的日期部分,然后再添加5个小时,以便按照班次安排将其换回。
如果您要对这些进行大量查询,最好创建第二个表,通过ID及其开始时间单独标识每个班次。然后,您可以使用包含执行计算的事件的表上的ON INSERT触发器填充轮班表,如果需要,将新行插入到轮班表中,并使用外键将事件行绑定到它。这也可以让您更轻松地查询特定班次期间发生的所有事件。
答案 3 :(得分:-2)
这个怎么样??
select
case
when datepart(Hh, dt) >= 5 AND datepart(Hh, dt) < 13 then 1
when datepart(Hh, dt) >= 13 AND datepart(Hh, dt) < 21 then 2
when datepart(Hh, dt) < 5 OR datepart(Hh, dt) >= 21 then 3
end
from myTable