选择查询中有一个开始时间和结束时间列表。我需要找出不包括重叠时间和任何休息时间的总时间。
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 :(得分: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;
在不太可能发生的事情中,没有人能打败我,我会在以后发布更好的内容。