Исключить время из значения даты и времени в другой строке - PullRequest
0 голосов
/ 08 февраля 2020

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

Например:

Сотрудник А работал над билет с 12 до 17 часов, и во время этого билета он находился в режиме ожидания в течение часа, т.е. с 15 до 16 часов, что необходимо исключить из общего времени, потраченного сотрудником А на билет.

Расчет:

Разница во времени в часах: 5

Билет в состоянии ожидания в часах: 1

Конечное время в часах: 4

Мне нужна ваша помощь в том, как это можно сделать SQL.

Вот что у меня есть:

DROP TABLE IF EXISTS #INC_Data;
    CREATE TABLE #INC_Data (
        IncidentNumber NVARCHAR(20) NOT NULL
        ,Mi_Definition VARCHAR(255) NOT NULL
        ,Mi_Value VARCHAR(255)
        ,Mi_Start DATETIME
        ,Mi_End DATETIME
        )

INSERT INTO #INC_Data (
    IncidentNumber
    ,Mi_Definition
    ,Mi_Value
    ,Mi_Start
    ,Mi_End
    )
VALUES (
    'INC8574030'
    ,'Create to Resolve Duration'
    ,NULL
    ,'10/30/2019 7:26:20 PM'
    ,'10/30/2019 7:56:40 PM'
    )
    ,(
    'INC8574030'
    ,'Incident State Duration'
    ,'Active'
    ,'10/30/2019 7:26:22 PM'
    ,'10/30/2019 7:28:21 PM'
    )
    ,(
    'INC8574030'
    ,'Assignment Group'
    ,'Unix-Lev-L1-team2'
    ,'10/30/2019 7:26:22 PM'
    ,'11/8/2019 8:00:28 PM '
    )
    ,(
    'INC8574030'
    ,'Incident State Duration'
    ,'In Progress'
    ,'10/30/2019 7:28:21 PM'
    ,'10/30/2019 7:56:30 PM'
    )
    ,(
    'INC8574030'
    ,'Assigned to Duration'
    ,'Ayush Chauhan'
    ,'10/30/2019 7:28:21 PM'
    ,'11/8/2019 8:00:28 PM '
    )
    ,(
    'INC8574030'
    ,'Incident State Duration'
    ,'Pending'
    ,'10/30/2019 7:56:28 PM'
    ,'10/30/2019 7:56:40 PM'
    )
    ,(
    'INC8574030'
    ,'Incident State Duration'
    ,'Resolved'
    ,'10/30/2019 7:56:40 PM'
    ,'11/8/2019 8:00:28 PM '
    )
    ,(
    'INC8574030'
    ,'Incident State Duration'
    ,'Closed'
    ,'11/8/2019 8:00:28 PM'
    ,NULL
    )
    ,(
    'INC8909432'
    ,'Create to Resolve Duration'
    ,NULL
    ,'12/23/2019 7:31:14 PM'
    ,'12/24/2019 12:59:29 PM'
    )
    ,(
    'INC8909432'
    ,'Incident State Duration'
    ,'Active'
    ,'12/23/2019 7:31:18 PM'
    ,'12/23/2019 7:42:59 PM'
    )
    ,(
    'INC8909432'
    ,'Assignment Group'
    ,'TDS-IS Data Compliance'
    ,'12/23/2019 7:31:18 PM'
    ,'1/2/2020 2:00:18 PM'
    )
    ,(
    'INC8909432'
    ,'Incident State Duration'
    ,'In Progress'
    ,'12/23/2019 7:42:59 PM'
    ,'12/23/2019 7:57:33 PM'
    )
    ,(
    'INC8909432'
    ,'Assigned to Duration'
    ,'Deepika N'
    ,'12/23/2019 7:42:59 PM'
    ,'12/23/2019 7:57:33 PM'
    )
    ,(
    'INC8909432'
    ,'Incident State Duration'
    ,'Pending'
    ,'12/23/2019 7:57:33 PM'
    ,'12/24/2019 12:59:29 PM'
    )
    ,(
    'INC8909432'
    ,'Assigned to Duration'
    ,'Gowtham Komisettu'
    ,'12/23/2019 7:57:33 PM'
    ,'12/24/2019 12:18:44 PM'
    )
    ,(
    'INC8909432'
    ,'Assigned to Duration'
    ,'Abhinav P'
    ,'12/24/2019 12:18:44 PM'
    ,'1/2/2020 2:00:18 PM'
    )
    ,(
    'INC8909432'
    ,'Incident State Duration'
    ,'Resolved'
    ,'12/24/2019 12:59:29 PM'
    ,'1/2/2020 2:00:18 PM'
    )
    ,(
    'INC8909432'
    ,'Incident State Duration'
    ,'Closed'
    ,'1/2/2020 2:00:18 PM'
    ,NULL
    )
    --SELECT * FROM #INC_Data
    --Order by IncidentNumber, Mi_Start

Запрос для подсчета часов, потраченных на правопреемника на билете и исключить ожидающие часы под ним

;WITH CTE
AS (
    SELECT d.IncidentNumber
        ,d.Mi_Definition
        ,d.Mi_Value
        ,d.Mi_Start
        ,d.Mi_End
        ,DATEDIFF(MINUTE, d.Mi_Start, d.Mi_End) AS Duration_in_Minutes
    FROM #INC_Data d
    WHERE (
            d.Mi_Definition = 'Assigned to Duration'
            OR d.Mi_Value = 'Pending'
            )
    )
    ,Total
AS (
    SELECT C.IncidentNumber
        ,C.Mi_Value AS [Assigned / Pending]
        ,SUM(C.Duration_in_Minutes) AS [Total (Min)]
    FROM CTE C
    GROUP BY C.IncidentNumber
        ,C.Mi_Value
    )
SELECT T.IncidentNumber
    ,T.[Assigned / Pending]
    ,T.[Total (Min)]
    ,CASE 
        WHEN T.[Total (Min)] < 0
            AND T.[Total (Min)] > - 60
            THEN '-'
        ELSE TRY_CAST(T.[Total (Min)] / 60 AS VARCHAR) + ':' + right('0' + CAST(ABS(T.[Total (Min)]) % 60 AS VARCHAR(2)), 2)
        END [Total (HH:mm:ss)]
FROM Total T
ORDER BY T.IncidentNumber
    ,T.[Assigned / Pending]

1 Ответ

0 голосов
/ 08 февраля 2020

Редактировать: Обновлен приведенный ниже SQL после уточнения ожидаемых результатов.

Select  Incident.IncidentNumber, Assignment.Mi_Value Assignee, 
    Assignment.Assignment_Start Assign_Start, Assignment.Assignment_End Assign_End,
    Pending.Pending_Start, Pending.Pending_End, 
    DateDiff(minute, Assignment_Start, Assignment_End) Assignment_Duration
    ,Case   When    Pending_Start < Assignment_End 
        And Pending_End > Assignment_Start 
        And Pending_End > Assignment_End
        Then    DateDiff(minute, Pending_Start, Assignment_End) 
        Else    0 End EndingOverlap
    ,Case   When    Pending_Start < Assignment_End 
        And Pending_End > Assignment_Start 
        And Pending_Start < Assignment_Start
        Then    DateDiff(minute, Assignment_Start, Pending_End)
        Else    0 End StartingOverlap
    ,Case   When    Pending_Start < Assignment_End 
        And Pending_End > Assignment_Start 
        And Pending_Start > Assignment_Start 
        And Pending_End < Assignment_End
        Then    DateDiff(minute, Pending_Start, Pending_End)
        Else    0 End PendingWithinAssignment
    ,Case   When    Pending_Start < Assignment_End 
        And Pending_End > Assignment_Start 
        And Pending_Start < Assignment_Start 
        And Pending_End > Assignment_End
        Then    DateDiff(minute, Assignment_Start, Assignment_End)
        Else    0 End AssignmentWithinPending
FROM    (
        Select  Distinct IncidentNumber 
        From    #INC_Data
    ) Incident
Outer Apply (
        Select  Mi_Value, Mi_Start Assignment_Start, Mi_End Assignment_End
        From    #INC_Data sub
        Where   sub.Mi_Definition = 'Assigned to Duration'
        And sub.IncidentNumber = Incident.IncidentNumber
        ) Assignment
Outer Apply (
        Select  Mi_Value, Mi_Start Pending_Start, Mi_End Pending_End
        From    #INC_Data sub
        Where   sub.Mi_Definition = 'Incident State Duration'
        And sub.Mi_Value = 'Pending'
        And sub.IncidentNumber = Incident.IncidentNumber
        ) Pending
Order by IncidentNumber

Предложение From является производной таблицей, которая будет возвращать отдельный набор результатов номеров инцидентов , Оттуда вы можете использовать внешнюю заявку, чтобы перечислить каждого человека и сроки, в которые билет был назначен им. Следующее внешнее применение получает временные рамки ожидающего состояния и применяет его к каждому человеку, назначенному этому билету. Как только у вас есть эти два диапазона дат, нужно просто определить, где продолжительность каких-либо совпадений. Операторы case разбивают каждый возможный сценарий наложения ...

(следующие столбцы - длительности в минутах)

EndingOverlap - это когда состояние ожидания начинается во время назначения и проходит после конца назначения.

StartingOverlap - это когда состояние ожидания начинается до назначения, но заканчивается после начала назначения.

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

AssignmentWithinPending охватывает сценарий, в котором билет находится в состоянии ожидания на протяжении всей продолжительности назначения (если не дольше).

При этом вы можете взять столбец Assignment_Duration и вычтите 4 столбца, описанные выше.

...