【问题标题】:Exclude time from datetime value in another row从另一行中的日期时间值中排除时间
【发布时间】:2020-02-08 15:57:50
【问题描述】:

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

例如:

员工 A 从中午 12 点到下午 5 点处理了一张工单,在此期间,工单处于“待处理”状态一个小时,即从下午 3 点到下午 4 点......这需要从员工花费的总时间中排除票上的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]

【问题讨论】:

  • 您好@Praveen 为清楚起见,根据给出的数据,Mi_Start 和 Mi_End 是什么意思。例如,Ayush Chauhan 的 Mi_Start 为“2019-10-30 19:28:21.000”,Mi_End 为“2019-11-08 20:00:28.000”
  • 您好 Gnyasha,Mi_start 是票分配给 Ayush 的时间,而 Mi_end 显示的是票分配给其他人的时间。

标签: sql-server tsql date-difference


【解决方案1】:

编辑:在对预期结果做出更多说明后更新了以下 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 子句是一个派生表,它将返回一个不同的事件编号结果集。从那里,您可以使用外部应用列出每个人以及分配给他们的工单的时间范围。下一个外部应用获取待处理状态的时间范围,并将其应用于分配给该工单的每个人。一旦有了这两个日期范围,只需找出任何重叠的持续时间。案例陈述分解了每个可能的重叠场景......

(下面的列是以分钟为单位的持续时间)

EndingOverlap 是指挂起状态在分配期间开始并超过分配结束时

StartingOverlap 是指挂起状态在分配之前开始但在分配开始之后结束。

PendingWithinAssignment 将涵盖工单在分配给一个人时进入和退出待处理状态的情况。

AssignmentWithinPending 涵盖工单在整个分配期间(如果不是更长)处于待处理状态的情况。

这样,您可以将 Assignment_Duration 列减去上述 4 列。

【讨论】:

  • 谢谢,迈克尔。我共享的查询显示了每个受让人在工单上花费了多少时间。我试图弄清楚如何从他们的总时间中排除待处理的时间。从 2019 年 12 月 23 日 19:57:33 到 2019 年 12 月 24 日 12:59:29,该票处于待处理状态。由于罚单正在等待 Gowthan,因此需要从他的总时间和 Abhinav 的时间中排除 41 分钟。希望我说得通
  • 选择 IncidentNumber ,Mi_Definition ,Mi_Value ,Mi_Start ,Mi_End ,DATEDIFF(MINUTE, Mi_Start, Mi_End) AS Duration_in_Minutes from #INC_Data whereincidentNumber = 'INC8909432' and (Mi_definition = 'Assigned to Duration' or Mi_value = '待定') 订单 1 ,4
  • 谢谢,迈克尔。只需少量修改,这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2022-06-21
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多