2017-09-14 42 views
0

我有兩個領域:在查詢(timeDiff測量)生產的總和多次

  • 初始(時間戳)
  • 決賽(時間戳)

我的查詢是:

SELECT TIMEDIFF(Final, Initial) 
    AS 'Worked Hours' 
    FROM `db_foo` 
    WHERE matriculation='X' AND date='2017-yy-yy' 

結果會像

Worked Hours  
03:34:00 
02:34:00 
01:00:00 
[...] 

是否可以對這些多個時間戳進行進一步求和,從而得到總工時數?

實施例的數據集(在CSV導出):

DATE --- ID --- INITIAL --- FINAL --- MATRICULATION 

2017-09-14,"29","2017-09-14 11:00:00","2017-09-14 14:34:00","4" 
2017-09-14,"30","2017-09-14 17:00:00","2017-09-14 19:34:00","4" 
2017-09-14,"31","2017-09-14 21:00:00","2017-09-14 22:00:00","4" 

希望的輸出(它是工作時間的總和):預先

Worked Hours 
07:08:00 

由於

+0

提供一些樣本數據集以及您想要的結果集 –

+0

完成,預先感謝。 – flapane

+0

https://stackoverflow.com/questions/3054123/calculate-a-sum-of-type-time-using-sql – KMS

回答

1

,以獲得所需結果您可以使用以下查詢

SELECT SEC_TO_TIME(
    SUM(
    TIMESTAMPDIFF(SECOND,Initial,Final) 
) 
) 
FROM `db_foo` /* WHERE clause*/; 

要獲得與以前的結果集沿着總和,你可以按照下面的方法

SELECT t.*,SEC_TO_TIME(SUM(workedhours)) 
FROM (
    SELECT ID, TIMESTAMPDIFF(SECOND,Initial,Final) workedhours 
    FROM `db_foo` /* WHERE clause*/ 
) t 
GROUP BY ID WITH ROLLUP; 

DEMO

+0

如果你要總結時間,爲什麼不SUM'TIM(TIMEDIFF(Initial,Final)) '而不是'SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,Initial,Final))'?另外,'TIME'數據的最大值爲'838:59:59'。如果工作時間超過838小時,此查詢將溢出。 – markusk

+0

@markusk道歉,但我是unbale先得到您的觀點首先查詢總結TIMESTAMPDIFF返回的秒數,然後根據用戶的願望格式化它現在如果OP想要獲得以小時,分鐘或秒等返回的差異SEC_TO_TIME只是爲了顯示作爲格式化的持續時間 –

+0

我的意思是'SEC_TO_TIME'將差異從'INTEGER'(秒)轉換爲'TIME','TIME'被限制爲最大值'838:59:59',這意味着您將獲得例如,'SELECT TIMESTAMPDIFF(SECOND,'2016-01-01','2017-01-01')/(60 * 60)'返回8784(這是正確的),而'SELECT SEC_TO_TIME(TIMESTAMPDIFF(SECOND,'2016-01-01','2017-01-01'))'返回錯誤的結果'838:59:59'。 – markusk

1

TIME類型有838:59:59最大值。如果您認爲總和可能超過838小時,則總結TIME表達式是不安全的。我建議,而不是轉換的時間差,以分鐘和顯示的總小時數爲十進制數,而不是時間:

SELECT 
    ROUND(SUM(TIMESTAMPDIFF(MINUTE, Initial, Final)/60.0), 1) AS "Worked Hours" 
FROM `db_foo` 
WHERE matriculation='X' AND date='2017-yy-yy'; 

這將返回

Worked Hours 
7.1 
+0

另外我看到你的方法與我的沒有什麼不同,除非你正在計算分鐘差異 –

+0

我的方法的不同之處在於,如果總時數超過838,它就可以工作。 – markusk

+0

謝謝你,你的方法絕對聰明。該表將在午夜更新,以便該值不超過24小時。 – flapane

0

試試這個

使用SEC_TO_TIMETIME_TO_SEC

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(Final, Initial)))) 
AS 'Worked Hours' 
FROM `db_foo` 
WHERE matriculation='X' AND date='2017-yy-yy' 

我希望它能幫助你。