SQL Server: группировка результатов по временному интервалу - PullRequest
3 голосов
/ 08 января 2010

У меня есть таблица MS SQL Server, в которой записываются события тревоги нашего завода со строкой для каждого сигнала тревоги и столбцом даты и времени для записи, когда сигнал тревоги произошел.

Мы работаем на нашем заводе в 12-часовые смены (с 6 до 18, с 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

Обратите внимание, что если тревоги происходят между 18:00, например, 5 января и 6:00 6 января, все они считаются ночными сменами с 5 января.

Любой совет?

1 Ответ

5 голосов
/ 08 января 2010

В этом решении я определяю время начала / окончания смены, вычитая 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...