Минутное использование с определенным таймфреймом - T-SQL - PullRequest
0 голосов
/ 18 мая 2018

Мне нужно посчитать количество активных минут, учитывая StartDTS и EndDTS для каждой строки, которые находятся в пределах определенного периода времени.

Например:

RowDTS:

  1. [StartDTS = 06:36:00] [EndDTS = 08:42:00]
  2. [StartDTS = 09:37:00] [EndDTS = 13:42:00]
  3. [StartDTS = 14:21:00] [EndDTS = 18:21:00]

Таймфрейм:

  • [Time_Frame_Start = 07:00:00] [Time_Frame_End = 15:30:00]

Если какая-либо часть времени между StartDTS и EndDTSпопадают в Time_Frame_Start и Time_Frame_End, эти минуты в пределах определенного периода времени должны быть подсчитаны.

CREATE TABLE #RowDTS (Indentifier varchar(255), StartDTS datetime2(7), EndDTS datetime2(7))
INSERT INTO #RowDTS
VALUES
('4318','2018-04-03 09:18:00.0000000','2018-04-03 10:20:00.0000000'),
('4397','2018-04-20 11:34:00.0000000','2018-04-20 12:27:00.0000000'),
('4459','2018-04-20 11:06:00.0000000','2018-04-20 11:54:00.0000000'),
('4739','2018-04-12 13:46:00.0000000','2018-04-12 17:34:00.0000000'),
('4845','2018-04-18 10:26:00.0000000','2018-04-18 15:18:00.0000000'),
('4933','2018-04-19 07:24:00.0000000','2018-04-19 09:51:00.0000000'),
('5063','2018-04-03 07:57:00.0000000','2018-04-03 11:00:00.0000000'),
('4855','2018-04-03 11:01:00.0000000','2018-04-03 11:51:00.0000000'),
('4858','2018-04-05 07:26:00.0000000','2018-04-05 11:12:00.0000000'),
('4972','2018-04-11 14:02:00.0000000','2018-04-11 16:36:00.0000000')
SELECT * FROM #RowDTS

По сути, это выходной файл, который я ищу:

+---------------+-----------------------------+-----------------------------+-----------------+
| RowIdentifier |          StartDTS           |           EndDTS            | UtilizedMinutes |
+---------------+-----------------------------+-----------------------------+-----------------+
|        431859 | 2018-04-03 09:18:00.0000000 | 2018-04-03 10:20:00.0000000 |                 |
|        439784 | 2018-04-20 11:34:00.0000000 | 2018-04-20 12:27:00.0000000 |                 |
|        445989 | 2018-04-20 11:06:00.0000000 | 2018-04-20 11:54:00.0000000 |                 |
|        473939 | 2018-04-12 13:46:00.0000000 | 2018-04-12 17:34:00.0000000 |                 |
|        484568 | 2018-04-18 10:26:00.0000000 | 2018-04-18 15:18:00.0000000 |                 |
|        493333 | 2018-04-19 07:24:00.0000000 | 2018-04-19 09:51:00.0000000 |                 |
|        506386 | 2018-04-03 07:57:00.0000000 | 2018-04-03 11:00:00.0000000 |                 |
|        485551 | 2018-04-03 11:01:00.0000000 | 2018-04-03 11:51:00.0000000 |                 |
|        485882 | 2018-04-05 07:26:00.0000000 | 2018-04-05 11:12:00.0000000 |                 |
|        497230 | 2018-04-11 14:02:00.0000000 | 2018-04-11 16:36:00.0000000 |                 |
+---------------+-----------------------------+-----------------------------+-----------------+

1 Ответ

0 голосов
/ 19 мая 2018

Я предположил, что ваш тип данных временного диапазона - ВРЕМЯ, и все значения StartDTS и EndDTS находятся в одном и том же дне.Этот запрос выполнит эту работу, но если значения даты могут попадать в разные дни, вам нужен CTE, чтобы получить тот же результат.

DECLARE @TimeFrameStart TIME = '10:00:00';
DECLARE @TimeFrameEnd TIME = '15:30:00';

SELECT [Indentifier], 
    CONVERT(TIME, [StartDTS]) AS [StartDTS],
    CONVERT(TIME, [EndDTS]) AS [EndDTS],

    CASE 
    WHEN CONVERT(TIME, [StartDTS]) >= @TimeFrameStart AND CONVERT(TIME, [EndDTS]) <= @TimeFrameEnd
        THEN DATEDIFF(MINUTE, [StartDTS], [EndDTS])
    WHEN CONVERT(TIME, [StartDTS]) <= @TimeFrameStart AND CONVERT(TIME, [EndDTS]) >= @TimeFrameEnd
        THEN DATEDIFF(MINUTE, @TimeFrameStart, @TimeFrameEnd)
    WHEN CONVERT(TIME, [StartDTS]) <= @TimeFrameStart AND CONVERT(TIME, [EndDTS]) > @TimeFrameStart
        THEN DATEDIFF(MINUTE, @TimeFrameStart, CONVERT(TIME, [EndDTS]))
    WHEN CONVERT(TIME, [EndDTS]) >= @TimeFrameEnd AND CONVERT(TIME, [StartDTS]) < @TimeFrameEnd
        THEN DATEDIFF(MINUTE, CONVERT(TIME, [StartDTS]), @TimeFrameEnd)
    ELSE 0
    END AS [UtilizedMinutes]
FROM #RowDTS;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...