Как разделить время начала и окончания разных дней на ежедневный стол? - PullRequest
0 голосов
/ 15 февраля 2020

Я борюсь с таблицей, которая показывает мне время начала и время окончания состояния машины, и я хотел бы суммировать часы, но только учитывая день ото дня.

В качестве примера:

ID STATUS    START_TIME          END_TIME
01 OPERATIVE 12/01/2020 08:00:00 14/01/2020 08:00:00
02 OPERATIVE 11/01/2020 05:00:00 13/01/2020 02:00:00

Мой ожидаемый результат дал бы мне таблицу, показывающую, что в 11/01/2020 машина № 2 работала с 05:00:00 до 23:59:59, так что это будет 19h. Машина номер два не работала вообще.

В 12/01/2020 машина номер один работала с 08:00:00 до 23:59:59 - 16h, а машина номер два работала целый день: 24h, поэтому это дало бы мне 24 часа + 16 часов в этот день = 40h.

И так, давай мне как часть финального стола:

DAY        WORKING_HOURS
11/01/2020 19H
12/01/2020 40H

Итак, что бы вы, ребята, ребята рекомендовать мне сделать? Как я могу решить это?

Заранее спасибо,

1 Ответ

0 голосов
/ 16 февраля 2020
;WITH calcs AS (
    -- 24 hours in seconds, minus 1 second for 23:59:59
    SELECT CAST(24 * 60 * 60 - 1 AS INT) AS [t_const_1]
    ,   CAST(2 * 24 * 60 * 60 - 1 AS INT) AS [t_const_2]
)
,   timeCTE AS (
    SELECT T.ID
    ,   T.START_TIME AS [start_dt]
        -- Find the "start" of the day (00:00:00) and add our constant
    ,   DATEADD(SECOND, calcs.[t_const_1], CAST(CAST(T.START_TIME AS DATE) AS DATETIME)) AS [end_dt_1]
    ,   T.END_TIME AS [end_dt]
    FROM #_tmp AS T, calcs
    UNION ALL
    SELECT T1.ID
    ,   DATEADD(HOUR, 24, CAST(CAST(T1.[end_dt_1] AS DATE) AS DATETIME)) AS [start_dt]

    -- Find the "start" of the day (00:00:00) and add our constant times 2
    ,   DATEADD(SECOND, calcs.[t_const_2], CAST(CAST(T1.[end_dt_1] AS DATE) AS DATETIME)) AS [end_dt_1]
    ,   T1.[end_dt]
    FROM timeCTE AS T1, calcs
    WHERE CAST(T1.[end_dt_1] AS DATE) < CAST(T1.[end_dt] AS DATE)
)
,   finalCTE AS (
    SELECT T2.ID
    ,   CONVERT(DATETIME, T2.[start_dt]) AS [start_dt]
    ,   CASE
            WHEN T2.[end_dt_1] > T2.[end_dt] THEN T2.[end_dt]
            ELSE T2.[end_dt_1]
        END AS [end_date]
    FROM timeCTE AS T2
)
SELECT fin.[ID]
,   CONVERT(DATETIME, fin.start_dt) AS [start_date]
,   CONVERT(DATETIME, fin.end_date) AS [end_date]
,   DATEPART(HOUR, fin.end_date) - DATEPART(HOUR, fin.[start_dt]) AS [net_daily_hours]
FROM finalCTE AS fin

Вывод:

ID  start_dt                end_date                net_hours
01  2020-01-12 08:00:00.000 2020-01-12 23:59:59.000 15
02  2020-01-11 05:00:00.000 2020-01-11 23:59:59.000 18
02  2020-01-12 00:00:00.000 2020-01-12 23:59:59.000 23
02  2020-01-13 00:00:00.000 2020-01-13 02:00:00.000 2
01  2020-01-13 00:00:00.000 2020-01-13 23:59:59.000 23
01  2020-01-14 00:00:00.000 2020-01-14 08:00:00.000 8

В основном взяты из этого поста .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...