1

我有以下问题,我必须将不同的事务分组到时间段中。假设您有一个包含条目日期时间戳的记录的表。这些记录由在不同班次工作的用户(操作员)创建

班次 1 : 5 - 13h // 班次 2 : 13 - 21h // 班次 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

4 回答 4

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 ...
于 2010-09-08T11:32:48.253 回答
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
于 2010-09-08T11:51:55.663 回答
0

如果您的数据库支持某种INTERVAL类型,请从事件的时间戳中减去 5 小时,使其相对于午夜而不是 0500 排列,并将时间部分除以 8 小时,以获得从零开始索引的班次编号。

要获得班次开始时间,请将班次编号乘以 8 小时,将其添加到您上面所做的减法的日期部分,然后再增加 5 小时以使其与您的班次时间表保持一致。

如果您要大量查询这些内容,最好创建第二个表,该表通过 ID 及其开始时间单独标识每个班次。然后,您可以在包含您的事件的表上使用 ON INSERT 触发器填充班次表,该表执行一次计算,如果需要,将新行插入班次表中,并使用外键将您的事件行与其关联。这也将为您提供一种更简单的方法来查询在特定轮班期间发生的所有事件。

于 2010-09-08T11:57:13.563 回答
-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
于 2010-09-08T11:25:30.270 回答