【问题标题】:single query to retrieve data in sql for different shift patterns为不同的班次模式检索 sql 中的数据的单个查询
【发布时间】:2014-12-08 08:31:25
【问题描述】:

我有两个工作班次: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

输出第二班 20:00 至 06:00

ID             ProductMade         Total
3                  3                  9

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

【问题讨论】:

  • 约翰,你为什么一周后又问同样的问题?你在这里问过stackoverflow.com/questions/27227474/…
  • 因为我还没有解决这个问题,我不知道如何推广这个问题,因为没有回应
  • 约翰,你的问题有不止一个答案,而且它们都有效。你怎么能不用给出的答案来解决它?
  • John 我看到你在 2 天前更改了另一个问题。也许你应该改变你提出问题的方法。我确信上一个问题有一个有效的答案。将帮助您的问题标记为已回答并在此处提出新问题以“升级”问题,因为目前它看起来像重复
  • jaques 我从来没有说过答案没有用,如果我不能解决它是不是犯罪,我为给您带来的不便表示歉意

标签: sql sql-server


【解决方案1】:

这将在 1 次内产生一些东西。我仍然不确定你在寻找什么输出。 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

【讨论】:

  • Table_Product 中的DateTime 代表什么? - 产品的生产时间。输出将是夜班分开和白班分开的所有记录
  • 好的,所以你想要的与 Table_product 表中的 DateTime 无关。那么 Table1 中的 DateTime 是什么,并且仍然是您期望的输出。
  • 我将现在预期的输出添加到问题中
  • @john,谢谢。只是一个问题,那么 EmpID 与它有什么关系呢?如果您只对 Table_Product 中的 DateTimeProductMade 感兴趣,为什么要从 Table1 中选择语句?是否可以生成与您生成的数据相关的 OUTPUT。
  • 我需要它,因为我计算了那个部门有多少人在轮班,所以我可以找出生产这些产品需要多少员工
【解决方案2】:

这样的?

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

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2012-07-14
    相关资源
    最近更新 更多