2014-11-04 82 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; 

在没有人打我给它的万一,我将在稍后发布更好的东西。