2017-03-08 25 views
0

我需要計算所有代理程序的總登錄次數。將SQL中所有代理的移位時間總計累計小時數,分鐘數,秒數

+-----------------------+-------------+-----------------------+-----------------------+ 
|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-03-07跨所有業務代表的總累計工時。例如,

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

我需要時間在hh:mm:ss。我正在使用SQL Server 2014來運行查詢。

我曾嘗試:

選擇
(SUM(DATEDIFF(第二,LoginTime,LogoutTime))/ 3600)[TOTALTIME]
FROM AgentStats

但我只得到時間在幾分鐘內。我需要它在hh:mm:ss。

+0

對不起...... 我曾嘗試: 選擇 (SUM(DATEDIFF(第二,LoginTime, LogoutTime))/ 3600)[TotalTime] FROM AgentStats GROUP BY ShiftDateAndTime – user1777929

回答

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進行分組。

UPDATE

我建議創建一個內聯用戶定義函數只是把它縮短並容易在一個大的查詢使用。

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

+0

我得到一個錯誤或消息。 Msg 102,Level 15,State 1,Line 4 'Seconds'附近的語法不正確。 我想你錯過了,在EMployeeID之後。即使在添加逗號後,我也會收到錯誤消息。 – user1777929

+0

謝謝。我從左側刪除了額外的括號,但我得到的結果如下: + -------------- + ---------------- + | EmployeeID | HH:MM:SS | + -------------- + ---------------- + | 8122 \t | 7:00:0 * | + -------------- + ---------------- + | 8214 \t | 6:00:0 * | + -------------- + ---------------- + | 8220 | 8:00:0 * | + -------------- + ---------------- + 但這是不對的。我的登錄時間和登出時間非常不規則。 – user1777929

+0

另外,我需要將所有代理的累計總小時數和分鐘數累加在一起。所以我需要按照班次日期分組 – user1777929

相關問題