2011-07-04 19 views
0

我有一個帶有工作站,工作站和會話的數據庫。會話描述哪個工作人員在哪個工作站上。我設法建立一個查詢,給我每個會話重疊的持續時間。MySQL中2個外鍵的每個組合的重疊持續時間之和

SELECT 
     sA.station_id, 
     sA.worker_id AS worker1, 
     sB.worker_id AS worker2, 
     SEC_TO_TIME(
      TIME_TO_SEC(LEAST(sA.end,sB.end)) - TIME_TO_SEC(GREATEST(sA.start,sB.start)) 
     ) AS overlap 
    FROM 
     `sessions` AS sA, 
     `sessions` AS sB 
    WHERE 
      sA.station_id = sb.station_id 
     AND 
      sA.station_id = 6 
     AND (
       sA.start BETWEEN sB.start AND sB.end 
      OR 
       sA.end BETWEEN sB.start AND sB.end 
     ) 

與此查詢我得到的結果是這樣

station_id worker1  worker2  overlap 
6    1    1  09:00:00 
6    2    1  02:30:00 
6    5    1  00:00:00 
6    1    1  09:00:00 
6    2    1  01:30:00 
6    3    1  09:00:00 
... 
6    12    3  02:00:00 
6    14    3  01:00:00 
6    17    3  02:00:00 
... 

我現在想就是總結重疊的worker1和worker2的每個組合,以獲得整體重疊的時間。

我試過使用SUM()和GROUP BY的不同方式,但我從來沒有得到想要的結果。

SELECT 
... 
SEC_TO_TIME(
    **SUM**(TIME_TO_SEC(LEAST(sA.end,sB.end)) - TIME_TO_SEC(GREATEST(sA.start,sB.start))) 
) AS overlap 
... 

#has as result 
station_id worker1 worker2 overlap 
6 1 1 838:59:59 

#in combination with 
GROUP BY 
    worker1 

#i get 
station_id worker1 worker2 overlap 
6 1 1 532:30:00 
6 2 1 -33:00:00 
6 3 1 270:30:00 
6 5 1 598:30:00 
6 6 1 542:00:00 
6 7 1 508:00:00 
6 8 5 53:00:00 
6 9 1 54:30:00 
6 10 1 310:00:00 
6 11 1 -108:00:00 
6 12 1 593:30:00 
6 14 1 97:30:00 
6 15 1 -53:30:00 
6 17 1 293:30:00 

最後的結果是接近,但我仍然缺少很多組合。我也不明白爲什麼會顯示組合8 - 5。

感謝烏拉圭回合的幫助(和時間來讀)

回答

0

aaargh,對不起我的愚蠢,該解決方案是非常簡單

.... 
SUM(((UNIX_TIMESTAMP(LEAST(sA.end,sB.end))-UNIX_TIMESTAMP(GREATEST(sA.start,sB.start)))/3600)) 
... 
GROUP BY station_id, worker1, worker2    
ORDER BY worker1, worker2 

我用/ 3600切換到使用時間戳,並將其轉化到小時因爲我以前使用的TIME_TO_SEC和SEC_TO_TIME方法僅使用DATETIME字段的TIME部分,從而產生了一些錯誤的數字。對於MySQL 5.5,我可以使用TO_SECONDS,但不幸的是我的服務器仍在運行5.1。

相關問題