从另一行的日期时间值中排除时间

问题描述 投票:0回答:1

我正在尝试获取有关在机票上花费的时间的报告。基本上,我有多位员工在处理一张票证,并且想报告他们在票证上工作了多少时间。

例如:

员工A从12 PM到5 PM工作了一张票,在此票上“挂起”了一个小时,即从3 PM-4 PM ..这需要从员工A花费的总时间中排除在票上。

计算:

时差: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]
sql-server tsql date-difference
1个回答
0
投票

我不确定您要如何显示结果,但以下查询应为您提供前进的路径。

SELECT Incident.IncidentNumber, DurationInMinutes.Total DurationInMinutes, PendingInMinutes.Total PendingInMinutes
FROM    (
        Select  Distinct IncidentNumber 
        From    #INC_Data
    ) Incident
Outer Apply (
        Select  SUM(DATEDIFF(minute, Mi_Start, Mi_End)) Total
        From    #INC_Data sub
        Where   sub.Mi_Definition = 'Assigned to Duration'
        And sub.IncidentNumber = Incident.IncidentNumber
        ) DurationInMinutes
Outer Apply (
        Select  SUM(DATEDIFF(minute, Mi_Start, Mi_End)) Total
        From    #INC_Data sub
        Where   sub.Mi_Definition = 'Incident State Duration'
        And sub.Mi_Value = 'Pending'
        And sub.IncidentNumber = Incident.IncidentNumber
        ) PendingInMinutes
Order by IncidentNumber

From子句是派生表,将返回不同的事件编号结果集。从那里,您可以使用外部应用程序求和分配给某人的时间(DurationInMinutes),第二个外部应用程序将执行相同的操作,但要查看在待处理状态下花费的时间。我以分钟为单位返回了总计,但是如果您想要的是详细程度,那么修改它就很简单,只需返回小时即可。

© www.soinside.com 2019 - 2024. All rights reserved.