2013-02-01 29 views
0

我希望這能解釋清楚什麼,我期待的。我已經通過本網站上的一些文章進行了搜索,但還沒有找到我在找什麼。我花了近3個小時試圖自己弄清楚這一點。如何總結TIMEDIFF的在時間

我試圖計算的記錄數和SUM的工作時間。這是我一直在處理的查詢。

SELECT Log.User 
, sum(if(hour(endtime) = 0, 1, 0)) AS Midnight 
, sum(if(hour(endtime) = 1, 1, 0)) AS `1AM` 
, sum(if(hour(endtime) = 2, 1, 0)) AS `2AM` 
, sum(if(hour(endtime) = 3, 1, 0)) AS `3AM` 
, sum(if(hour(endtime) = 4, 1, 0)) AS `4AM` 
, sum(if(hour(endtime) = 5, 1, 0)) AS `5AM` 
, sum(if(hour(endtime) = 6, 1, 0)) AS `6AM` 
, sum(if(hour(endtime) = 7, 1, 0)) AS `7AM` 
, sum(if(hour(endtime) = 8, 1, 0)) AS `8AM` 
, sum(if(hour(endtime) = 9, 1, 0)) AS `9AM` 
, sum(if(hour(endtime) = 10, 1, 0)) AS `10AM` 
, sum(if(hour(endtime) = 11, 1, 0)) AS `11AM` 
, sum(if(hour(endtime) = 12, 1, 0)) AS `12PM` 
, sum(if(hour(endtime) = 13, 1, 0)) AS `1PM` 
, sum(if(hour(endtime) = 14, 1, 0)) AS `2PM` 
, sum(if(hour(endtime) = 15, 1, 0)) AS `3PM` 
, sum(if(hour(endtime) = 16, 1, 0)) AS `4PM` 
, sum(if(hour(endtime) = 17, 1, 0)) AS `5PM` 
, sum(if(hour(endtime) = 18, 1, 0)) AS `6PM` 
, sum(if(hour(endtime) = 19, 1, 0)) AS `7PM` 
, sum(if(hour(endtime) = 20, 1, 0)) AS `8PM` 
, if(hour(endtime) = 20, sec_to_time(sum(time_to_sec(endtime) - time_to_sec(starttime))), 0) AS `8PM Time` 
, sum(if(hour(endtime) = 21, 1, 0)) AS `9PM` 
, sum(if(hour(endtime) = 22, 1, 0)) AS `10PM` 
, sum(if(hour(endtime) = 23, 1, 0)) AS `11PM` 
FROM 
    (
    SELECT user 
    , controlnumber 
    , starttime 
    , endtime 
    , timediff(endtime, starttime) AS Worktime 
FROM 
    atrtaxcert.ordertimeworked 
) AS Log 
GROUP BY 
    Log.User; 

這些開始和結束時間相隔只有幾分鐘。 任何指導是非常讚賞。這是我的第一篇文章,無法提供任何圖片來幫助描述。

+0

目前正在該查詢工作?你想優化這個查詢嗎? 什麼是您的具體要求 –

回答

0

如果開始時間和結束時間的時間數據類型,然後使用TIME_TO_SEC功能,並做了減法。總計秒數,然後將總數轉換爲字符串表示形式。

SELECT `Log`.`User` 
    , ... 
    , SUM(HOUR(`Log`.endtime)=20) AS `8PM_count` 
    , SUM(IF(HOUR(`Log`.endtime)=20,work_seconds,0) AS `8PM_seconds` 
    , SEC_TO_TIME(SUM(IF(HOUR(`Log`.endtime)=20,`Log`.work_seconds,0) AS `8PM_hhhmmss` 
    , ... 
    FROM (SELECT 
       , TIME_TO_SEC(endtime)-TIME_TO_SEC(starttime) AS work_seconds 
     ) `Log` 
GROUP 
    BY `Log`.`User` 

注:本:

SELECT HOUR(endtime)=0 AS foo 

是速記相當於

SELECT IF(HOUR(endtime) = 0, 1, 0) AS foo 

如果starttimeendtime是DATETIME值時,您可以使用TIMESTAMPDIFF函數來計算以秒爲單位的差異:

SELECT `Log`.`User` 
    , ... 
    , SUM(HOUR(`Log`.endtime)=20) AS `8PM_count` 
    , SUM(IF(HOUR(endtime)=20,TIMESTAMPDIFF(SECOND,`Log`.starttime,`Log`.endtime),0) AS `8PM_seconds` 
    , ... 
    FROM (
     ) `Log` 
GROUP 
    BY `Log`.`User` 

(您可能希望忽略例如在運行時返回的值。開始時間= '23:59:00' 和結束時間= 00:01:00' ,這將需要另一個條件測試)

+0

感謝。如果只有我嘗試了一段時間。有時它只是有助於離開。剛開始時必須添加「sec_to_time」才能恢復時間格式 – ScottieDont