将 SQL 中所有客服人员轮班时间的总累计小时数、分钟数、秒数相加

Add up Total Cumulative Hours, Minutes, Seconds from shift times for all agents in SQL

我需要计算所有代理的总 'Logged in' 次。

+-----------------------+-------------+-----------------------+-----------------------+  
|ShiftDateAndTime       |EmployeeID   |LoginTime              |LogoutTime             |  
+-----------------------+-------------+-----------------------+-----------------------+  
|2017-03-07 08:59:56.000|   81200     |2017-03-07 08:59:56.000|2017-03-07 17:30:43.000|  
+-----------------------+-------------+-----------------------+-----------------------+  
|2017-03-07 07:35:12.000|   82300     |2017-03-07 07:35:12.000|2017-03-07 16:04:30.000|  
+-----------------------+-------------+-----------------------+-----------------------+  
|2017-03-07 09:38:58.000|   81800     |2017-03-07 09:38:58.000|2017-03-07 18:02:59.000|  
+-----------------------+-------------+-----------------------+-----------------------+  
|2017-03-07 09:18:52.000|   83240     |2017-03-07 09:18:52.000|2017-03-07 18:08:54.000|  
+-----------------------+-------------+-----------------------+-----------------------+  

我想计算 2017 年 3 月 7 日所有代理的总累计工时。例如,

Sum(LogoutTime - LoginTime for Agent1, Agent2, Agent3 and Agent4.)  

我需要 hh:mm:ss 的时间。我正在使用 SQL Server 2014 来 运行 查询。

我试过:

SELECT
(SUM (datediff(second, LoginTime, LogoutTime)) / 3600) [TotalTime]
FROM AgentStats

但是我只得到了几分钟的时间。我需要它 hh:mm:ss.

我使用 CTE 只是为了方便将结果格式化为 HH:MM:SS

WITH acm AS
(
    SELECT   SUM (DATEDIFF(second, LoginTime, LogoutTime)) [Seconds]
    FROM     @AgentStats
    WHERE    DATEADD(dd, 0, DATEDIFF(dd, 0, ShiftDateAndTime)) = CAST('2017-03-07' AS DATETIME)
)
SELECT CONVERT(VARCHAR(10),Seconds/3600)  
       +':' 
       + RIGHT('00'+CONVERT(VARCHAR(2),(Seconds%3600)/60),2) 
       +':' 
       + RIGHT('00'+CONVERT(VARCHAR(2),Seconds%60),2) AS [HH:MM:SS]
FROM   acm;

结果是:

HH:MM:SS
34:14:08

在这里查看:http://rextester.com/EHCSY33410

您不需要按 ShiftDateAndTime 分组,因为您只选择了一天。

更新

我建议创建一个 INLINE 用户定义函数,以使其更短且易于在大型查询中使用。

CREATE FUNCTION dbo.SecondsToHMS(@Seconds int)
RETURNS table
AS
RETURN
(
    SELECT CONVERT(VARCHAR(20), @Seconds / 3600) + ':' 
           + RIGHT('00' + CONVERT(VARCHAR(2), (@Seconds % 3600) / 60) ,2) + ':' 
           + RIGHT('00' + CONVERT(VARCHAR(2), @Seconds%60), 2) AS [HMS]
);

GO

那么之前的查询可以改成:

SELECT   (SELECT HMS FROM dbo.SecondsToHMS(SUM (DATEDIFF(second, LoginTime, LogoutTime)))) [HMS]
FROM     @AgentStats
WHERE    DATEADD(dd, 0, DATEDIFF(dd, 0, ShiftDateAndTime)) = CAST('2017-03-07' AS DATETIME)
GO

/*
|HMS     |
|:-------|
|34:14:08|
*/

dbfiddle here