SQL Server:按时间间隔分组结果

use*_*211 3 sql-server datetime group-by

我有一个MS 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
Run Code Online (Sandbox Code Playgroud)

我们需要将结果分组如下:

Date        Shift     Count 
2010-01-05  Day       1  
2010-01-05  Night     2 
2010-01-06  Day       1
Run Code Online (Sandbox Code Playgroud)

请注意,如果在1月5日下午6点到1月6日上午6点之间发生警报,​​则从1月5日开始计算夜班.

有什么建议?

Ed *_*per 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
Run Code Online (Sandbox Code Playgroud)