首页 > 解决方案 > SQL 查询以获取基于单个日期时间列的特定状态所花费的时间

问题描述

我需要构建一个 SQL 查询,在其中我可以花在多个状态上的时间(onHold、Waiting for customer、Resolved、Closed),所以基本上我不想包括花在这个状态上的时间,表格如下所示

在此处输入图像描述

所以我需要一个查询,我可以在其中获得实际花费在票证上的时间或花费在状态上的时间,到目前为止我已经尝试过以下解决方案并尝试过Cross APPLY,但似乎都没有像预期的那样帮助我。

到目前为止尝试了下面的查询,这给了我在第一个等待状态上花费的正确时间,而不是在那之后:

SELECT t1.TICKETNUMBER,SUM(DATEDIFF(MINUTE,TICKETTIME,CloseTime)) as TotalMinutes
FROM [Admin].[TbtrnTicketHistory] t1
CROSS APPLY(SELECT TOP 1 TICKETTIME as CloseTime FROM [Admin].[TbtrnTicketHistory] t2 WHERE t1.TICKETNUMBER = t2.TICKETNUMBER and t2.TICKETHISTORYID > t1.TICKETHISTORYID ORDER BY t2.TICKETTIME) as t2
WHERE t1.CURRENTSTATUS_ANALYST not in('On-Hold','Waiting For Customer','Resolved','Closed') and t1.ticketnumber = '211135'
GROUP BY t1.TICKETNUMBER;

在sql中计算两行中两次之间的差异

计算两个连续行之间的时间差

标签: sqlsql-servertsql

解决方案


使用 SQL Server,您可以使用那些非常有用的窗口函数 LEAD 和 FIRST_VALUE :

select *
    ,[duration(sec)] = DATEDIFF(SECOND
                                ,ticketTime
                                ,LEAD(ticketTime,1,ticketTime)over(partition by ticketNumber order by ticketTime)
                                )

    ,[cumulative duration(sec)] = DATEDIFF( SECOND
                            , FIRST_VALUE(ticketTime)over(partition by ticketNumber order by ticketTime)
                            , ticketTime)
from (values
     (1,cast('20211101 10:00:01' as datetime))
    ,(1,'20211101 10:00:33')
    ,(1,'20211101 10:01:59')
 )T(ticketNumber,ticketTime)
票号 票时间 持续时间(秒) 累积持续时间(秒)
1 2021-11-01 10:00:01.000 32 0
1 2021-11-01 10:00:33.000 86 32
1 2021-11-01 10:01:59.000 0 118

推荐阅读