单个查询以在sql中检索不同班次模式的数据

时间:2014-12-08 08:31:26

标签: sql sql-server

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

时将从SQL表中检索数据

这是我的表Table1

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

表产品

ID      DateTime                  ProductMade
47      2014-12-07 11:00:00       Milk
47      2014-12-07 08:00:00       Juice
47      2014-12-08 00:00:00       Bread
47      2014-12-08 04:00:00       Cakes
47      2014-12-07 21:00:00       Juice
89      2014-12-01 04:00:00       bread

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

select Count(EmpID) as ID,Count (ProductMade) ProductsTotal, Count(EmpID) * Count (ProductMade) as Total
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()-2), 0) + '18:00' and DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()-1), 0) + '06:00' and DepartmentID=47

因此,这将获得具有相同ID匹配的所有记录

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

08:00至16:30之间

select Count(EmpID) as ID,Count (ProductMade) ProductsTotal, Count(EmpID) * Count (ProductMade) as Total
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))=-2 and DATEPART(HOUR,T1.DateTime) BETWEEN '07' AND '16' and DepartmentID=47

OutPUT FirstShift 08:00至16:30

ID             ProductMade         Total
2                  2                  4

OutPut Second Shift 20:00至06:00

ID             ProductMade         Total
3                  3                  9

所以第二个班次请求的开始日期为-2,结束日期为-1,这是与白班不同的部分。因为我将通过我想要从选择框中倒退的天数

2 个答案:

答案 0 :(得分:0)

这样的东西?

where ((@shift = 1 and t1.datetime between ... ) or (@shift = 2 and datediff ... ))

答案 1 :(得分:0)

这将产生一些东西。我还不确定你在寻找什么输出。 Table_Product中的DateTime代表什么?

DECLARE @days int
SET @days = 4;

WITH Tab as (
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(datetime, Floor(Convert(float, Convert(datetime, GetDate())) - @days)))
and DateAdd(hour, 30, Convert(datetime, Floor(Convert(float, Convert(datetime, GetDate())) - @days)))
),
Prod as (
Select case when DATEPART(hour, t.DateTime) between 8 and 16 then 'A' else 'B' end AS Shift, *
from Table_Product t
where t.DateTime between DateAdd(hour, 8, Convert(datetime, Floor(Convert(float, Convert(datetime, GetDate())) - @days)))
and DateAdd(hour, 30, Convert(datetime, Floor(Convert(float, Convert(datetime, GetDate())) - @days))))
Select ID, ProductMake, Shift, Count(*), (Select Count(*) from Tab where ID = t1.ID and Shift = t1.Shift) Total from Prod t1 
GROUP BY ID, Shift, ProductMake