【问题标题】:SQL Server: Group results on time intervalSQL Server:按时间间隔对结果进行分组
【发布时间】:2010-01-08 08:05:27
【问题描述】:

我有一个 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

我们需要像这样对结果进行分组:

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

请注意,如果警报发生在 1 月 5 日下午 6 点和 1 月 6 日早上 6 点之间,则从 1 月 5 日开始,它们都会被计为夜班。

有什么建议吗?

【问题讨论】:

    标签: sql-server datetime group-by


    【解决方案1】:

    在此解决方案中,我通过从事件时间中减去 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2015-01-03
      • 2015-01-05
      相关资源
      最近更新 更多