2010-01-08 73 views
3

我有一個MS SQL Server表,它記錄了我們工廠的報警事件,每行報警和日期時間列記錄發生報警時的行。SQL Server:按時間間隔分組的結果

我們在12小時內(上午6點到下午6點,下午6點到上午6點)運行我們的工廠,我需要弄清楚我們每班有多少報警。如何將我的結果分組以獲得該結果?

原始表看起來是這樣的:

DateTime    Alarm Name 
2010-01-05 14:32:22 Overpressure 
2010-01-05 21:32:59 Underspeed 
2010-01-06 05:58:13 Underspeed 
2010-01-06 06:02:46 Machine Current Fault 

而且我們需要組的結果是這樣的:

Date  Shift  Count 
2010-01-05 Day  1 
2010-01-05 Night  2 
2010-01-06 Day  1 

注意,如果報警下午6點之間發生的說,1月5和6月1日6點,他們都被視爲1月5日的夜班。

有什麼建議嗎?

回答

5

在此解決方案中,我通過從事件時間減去6小時來計算輪班開始/結束時間。

DECLARE @t TABLE 
([DateTime] DATETIME 
,[Alarm Name] VARCHAR(30) 
) 

INSERT @t 
     SELECT '2010-01-05 14:32:22','Overpressure' 
UNION SELECT '2010-01-05 21:32:59','Underspeed' 
UNION SELECT '2010-01-06 05:58:13','Underspeed' 
UNION SELECT '2010-01-06 06:02:46','Machine Current Fault' 



SELECT CONVERT(CHAR(10),DATEADD(hh,-6,[DateTime]),120) AS date 
     ,CASE WHEN DATEPART(hh,DATEADD(hh,-6,[DateTime])) < 12 
      THEN 'day' 
      ELSE 'night' 
     END AS shift 
     ,COUNT(1) AS cnt 
FROM @t 
GROUP BY CONVERT(CHAR(10),DATEADD(hh,-6,[DateTime]),120) 
     ,CASE WHEN DATEPART(hh,DATEADD(hh,-6,[DateTime])) < 12 
      THEN 'day' 
      ELSE 'night' 
     END 
order by 1,2 
+0

這是完美的 - 感謝您的幫助 – user246211 2010-01-11 01:19:22