将时间戳细分为3个时隙

时间:2010-09-08 11:07:46

标签: sql datetime dateadd

我有以下问题,我必须将不同的交易分组到时间段。假设您有一个包含条目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进行一些查询但是我没有让它工作......有人可以帮忙吗?感谢

4 个答案:

答案 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
相关问题