Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:按时间间隔对结果进行分组_Sql Server_Datetime_Group By - Fatal编程技术网

Sql server SQL Server:按时间间隔对结果进行分组

Sql server SQL Server:按时间间隔对结果进行分组,sql-server,datetime,group-by,Sql Server,Datetime,Group By,我有一个MS SQL Server表,记录我们工厂的报警事件,每个报警有一行,报警发生时有一个datetime列 我们以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

我有一个MS SQL Server表,记录我们工厂的报警事件,每个报警有一行,报警发生时有一个datetime列

我们以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
我们需要将结果分组如下:

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日起,所有报警都被计为夜班


有什么建议吗?

在这个解决方案中,我通过从事件时间中减去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
DECLARE@t表
([DateTime]DateTime
,[Alarm Name]VARCHAR(30)
)
插入@t
选择“2010-01-0514:32:22”,“过压”
工会选择“2010-01-05 21:32:59”,“低速”
工会选择“2010-01-06 05:58:13”,“低速”
联合选择“2010-01-06 06:02:46”,“机器电流故障”
选择CONVERT(字符(10),DATEADD(hh,-6,[DateTime]),120)作为日期
,DATEPART(hh,DATEADD(hh,-6,[DateTime]))小于12时的大小写
然后是“一天”
“晚上”
以班次结束
,将(1)计数为cnt
来自@t
按转换分组(字符(10),日期添加(hh,-6,[DateTime]),120)
,DATEPART(hh,DATEADD(hh,-6,[DateTime]))小于12时的大小写
然后是“一天”
“晚上”
结束
以1,2的顺序排列