如何为不同的工作班次设置特定的时间间隔以检索数据

时间:2014-12-01 11:31:13

标签: sql sql-server stored-procedures

我有两个工作班次:8:00:00到16:30:00和20:00:00到06:00:00。 我想创建一个存储过程,当我传递日期

时将从SQL表中检索数据 这是我的表格 表1 Emp

ID   DateTime                 EmpID
47   2014-12-05 08:00:00      1111
47   2014-12-05 08:25:00      1235
47   2014-12-05 23:55:00      4569
47   2014-12-06 00:00:00      4563
47   2014-12-06 02:00:00      7412
59   2014-12-06 04:00:00      8523
59   2014-12-05 10:30:00      5632

表2产品

ID     DateTime              ProductMade
47     2014-12-05 11:00:00   Milk
47     2014-12-05 08:00:00   Juice
47     2014-12-06 00:00:00   Bread
47     2014-12-06 06:00:00   Cakes

查询班次2 18:00至06:00

SELECT *  
FROM Table 1  as T1 
INNER JOIN Table_Product as Prod ON t1.ID=Prod.ID 
WHERE  T1.DateTime BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()-8), 0) + '18:00'
AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()-7), 0) + '06:00'

所以这将获得具有相同ID匹配的所有记录

然后我必须为第一班做另一个查询。

08:00至16:30之间

SELECT *  
FROM Table 1  AS T1
INNER JOIN
Table_Product AS Prod ON t1.ID=Prod.ID  
WHERE  DATEDIFF(day, CONVERT(VARCHAR(10), GETDATE(),110), CONVERT(VARCHAR(10), T1.DateTime,110))=-1 AND DATEPART(HOUR,T1.DateTime) BETWEEN '07' AND '16'

如何将其整合到一个存储过程中,并在有两个查询的情况下消除它。

2 个答案:

答案 0 :(得分:1)

如果您希望将其用于特定班次,请尝试此操作。然后你必须指定@Shift

Declare @Shift char(1),
        @days int
Set @Shift = 'A'  -- will only get information for SHIFT A. Change to B if you want the rest
Set @days = 1

Select * 
from Table1 t
where t.DateTime between 
case when @Shift = 'A' then DateAdd(hour, 8, Convert(date, GetDate() - @days)) 
else DateAdd(hour, 20, Convert(date, GetDate() - @days)) end 
and 
case when @Shift = 'A' then DateAdd(hour, 16, Convert(date, GetDate() - @days)) 
else DateAdd(hour, 30, Convert(date, GetDate() - @days)) end

指定Shift和日期,它应该有效。

你也可以做这样的事情。这只需要指定过去的天数,它将检索信息并在第一列中指定Shift

DECLARE @days int
SET @days = 1

Select case when DATEPART(hour, t.DateTime) between 8 and 16 then 'A' else 'B' end AS Shift, *
from Table1 t
where t.DateTime between DateAdd(hour, 8, Convert(date, GetDate() - @days))
and DateAdd(hour, 30, Convert(date, GetDate() - @days))
ORDER BY 1, t.DateTime

答案 1 :(得分:0)

您似乎每天有两班倒,白班开始在夜班之前。所以,让我们列举一下这些变化,然后让你选择你想要的那个:

select t.*
from (select t.*,
             row_number() over (partition by cast(sp.datetime as date)
                                order by sp.datetime
                               ) as shiftnumber
      from table t
     ) t
where DATEDIFF(day, CAST(GETDATE() as DATE), CAST(SP.DateTime as DATE)) = -1 and
      shiftnumber = 1;

请注意,我也更改了日期算术。转换为日期使用内置的DATE类型。将日期转换为字符串并返回日期是不优雅的。