将 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
我需要计算所有代理的总 '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