【问题标题】:Add up Total Cumulative Hours, Minutes, Seconds from shift times for all agents in SQL将 SQL 中所有代理的轮班时间的总累积小时数、分钟数、秒数相加
【发布时间】:2017-07-29 17:49:24
【问题描述】:

我需要计算所有代理的总“登录”时间。

+-----------------------+-------------+-----------------------+-----------------------+  
|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 运行查询。

我试过了:

选择
(SUM (datediff(second, LoginTime, LogoutTime)) / 3600) [TotalTime]
来自代理统计

但我只能得到几分钟的时间。我需要它在 hh:mm:ss 中。

【问题讨论】:

  • 对不起...我试过了:SELECT (SUM (datediff(second, LoginTime, LogoutTime)) / 3600) [TotalTime] FROM AgentStats GROUP BY ShiftDateAndTime

标签: sql-server sql-server-2014 datediff


【解决方案1】:

我使用 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

【讨论】:

  • 我收到一条错误消息。消息 102,级别 15,状态 1,第 4 行“秒”附近的语法不正确。我想你错过了 , 在 EMployeeID 之后。即使添加了逗号,我也会收到错误消息。
  • 谢谢。我从左边删除了多余的括号,但得到的结果如下:+--------------+----------------+ |员工ID | HH:MM:SS | +--------------+----------------+ | 8122 | 7:00:0* | +--------------+----------------+ | 8214 | 6:00:0* | +--------------+----------------+ | 8220 | 8:00:0* | +----------------------------+----------------+ 但那是不对的。我的登录时间和注销时间非常不规律。
  • 另外,我需要所有代理的累计总小时数和分钟数。所以我需要按班次日期分组
  • 最后一个问题,先生。 >> 如何在我的另一个更大的查询中添加这个查询?例如:Select field1, field2, field3, (WITH acm AS (......) FROM acm;) HH:MM:SS From BiggerQueryTable
  • 非常感谢您的帮助。
猜你喜欢
  • 2020-07-13
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2017-03-28
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多