针对SQL中的特定班次的周/月转换报告

时间:2015-12-16 20:37:27

标签: sql sql-server sql-server-2008

在我的界面中,我有两个过滤器:

Date - Today , Yesterday, WTD , MTD
Shift - 1st, 2nd, 3rd

班次时间如下:

1st: 06:00 - 14:00
2nd: 14:00 - 22:00
3rd: 22:00 - 06:00

我通过以下查询计算每种材料的生产质量:

SELECT 
       C.MATERIAL
      ,G.MACHINE
      ,F.PART   
      ,SUM(A.QT_CONFIRMED) QT_CONFIRMED

 FROM 
       CONFIRMATION A 

       INNER JOIN LOT_RECORD B ON A.LOT_RECORD_ID=B.LOT_RECORD_ID
       INNER JOIN LOT C ON B.LOT_RECORD_ID=C.LOT_RECORD_ID
       INNER JOIN MATERIAL D ON C.MATERIAL = D.MATERIAL
       INNER JOIN PART F ON C.PART=F.PART
       INNER JOIN MACHINE G ON F.MACHINE=G.MACHINE

WHERE
      A.DT_CONFIRMATION BETWEEN '[Param.1]' AND '[Param.2]'

GROUP BY
       C.MATERIAL
      ,G.MACHINE
      ,F.PART

ORDER BY 
       G.MACHINE ASC

今天/昨天,我可以获取日期和班次,并可以将相关参数传递给查询并获得正确的输出。

如果我选择昨天然后选择第二班,那么

Param.1 = 2015-12-14T14:00:00 
Param.2 = 2015-12-14T22:00:00

但我面临的问题是WTD和MTD。如果我选择MTD和第一班,那么

我的开始日期是12月1日。结束日期将是12月15日。 现在我无法通过

Param.1 = 2015-12-01T06:00:00
Param.2 = 2015-12-15T14:00:00

因为它会计算所有班次的数量。我需要传递参数,使其仅在12月1日至12月15日的06:00至14:00之间计算数量。

Also, for 3rd shift the time will be 10 PM of the start date and 6 AM of startdtae + 1.

我怎样才能实现这一目标?我真的很困惑和困惑。

由于

1 个答案:

答案 0 :(得分:1)

使用SQL中的DATEPART()函数添加另一个条件,检查DT_CONFIRMATION列的小时是否在您要过滤的班次的小时内。

因此,如果您只搜索Shift 1,则需要添加:

AND DATEPART(hour, DT_CONFIRMATION) BETWEEN 6 AND 14

到你的WHERE条款。您显然需要使用基于Shift的小时参数化WHERE子句,这与您对日期的操作相同。