我有两个工作班次:8:00:00到16:30:00和20:00:00到06:00:00。 我想创建一个存储过程,当我传递日期
时将从SQL表中检索数据 这是我的表格 表1 EmpID 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'
如何将其整合到一个存储过程中,并在有两个查询的情况下消除它。
答案 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
类型。将日期转换为字符串并返回日期是不优雅的。