2014-11-04 83 views
0

從選擇查詢中有開始時間和結束時間的列表。我需要找出排除重疊時間和休息時間的總時間。計算排除MySQL中的重疊時間和中斷的總時間

StartTime     EndTime 
2014-10-01 10:30:00.000  2014-10-01 12:00:00.000 -- 90 mins 
2014-10-01 10:40:00.000  2014-10-01 12:00:00.000 --0 since its overlapped with previous 
2014-10-01 10:42:00.000  2014-10-01 12:20:00.000 -- 20 mins excluding overlapped time 
2014-10-01 10:40:00.000  2014-10-01 13:00:00.000 -- 40 mins 
2014-10-01 10:44:00.000  2014-10-01 12:21:00.000 -- 0 previous ones have already covered this time range 
2014-10-13 15:50:00.000  2014-10-13 16:00:00.000 -- 10 mins 

所以在這種情況下總共應該是160分鐘。

我有一些想法,有很多循環,如果是。只是尋找一些簡單的解決方案,如果可用

+0

應該採取什麼結果實際上是什麼樣子?只有一個數字? – Strawberry 2014-11-04 17:19:58

+0

我需要每個月都有總計時間。 – Reema 2014-11-04 17:24:10

回答

1

這是一個缺口和孤島類型的問題。這裏有一個方法來解決它

SELECT SUM(minutes) total 
    FROM 
(
    SELECT TIMESTAMPDIFF(MINUTE, MIN(starttime), MAX(endtime)) minutes 
    FROM 
    (
    SELECT starttime, endtime, 
      @g := IF(@e BETWEEN starttime AND endtime OR endtime < @e, @g, @g + 1) g, 
      @e := endtime   
     FROM table1 CROSS JOIN 
    (
     SELECT @g := 0, @e := NULL 
    ) i 
    ORDER BY starttime, endtime 
) q 
    GROUP BY g 
) q 

輸出:

 
| TOTAL | 
|-------| 
| 160 | 

這裏是一個SQLFiddle演示

0

這裏有一個坦白較差和不完整的解決方案...

SELECT SUM(TIME_TO_SEC(n))/60 
FROM 
(SELECT MAX(diff) n 
    FROM 
     (SELECT x.* 
       , MAX(y.endtime) max_endtime 
       , TIMEDIFF(MAX(y.endtime),x.starttime) diff 
      FROM my_table x 
      JOIN my_table y 
       ON y.endtime >= x.starttime 
      AND y.starttime <= x.endtime 
      GROUP 
       BY x.id 
     ) a 
    GROUP 
     BY max_endtime 
) z; 

在沒有人打我給它的萬一,我將在稍後發佈更好的東西。