计算不包括重叠时间的总时间&在MySQL中断

时间:2014-11-04 17:11:39

标签: 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分钟。

我有很多循环的想法,如果是的话。只是寻找一些简单的解决方案。

2 个答案:

答案 0 :(得分: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 演示

答案 1 :(得分: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;

在不太可能发生的事情中,没有人能打败我,我会在以后发布更好的内容。