我想找到一段时间不用的时间段。 例如,给出下表:
Table 1
UserID Start End
1 2014-06-02 09:00 2014-06-02 14:00
2 2014-06-02 19:00 2014-06-02 21:00
3 2014-06-02 20:00 2014-06-02 22:00
4 2014-06-03 03:00 2014-06-03 08:00
5 2014-06-03 13:00 2014-06-03 15:00
6 2014-06-03 20:00 2014-06-03 23:00
7 2014-06-03 23:00 2014-06-04 05:00
8 2014-06-04 09:00 2014-06-04 13:00
Expected result:
Start End
2014-06-02 00:00 2014-06-02 09:00
2014-06-02 14:00 2014-06-02 19:00
2014-06-02 22:00 2014-06-03 00:00
2014-06-02 00:00 2014-06-03 03:00
2014-06-03 08:00 2014-06-03 13:00
2014-06-03 15:00 2014-06-03 20:00
2014-06-04 05:00 2014-06-04 09:00
2014-06-04 13:00 2014-06-05 00:00
答案 0 :(得分:2)
此查询包含两个使用UNION的查询。第一个:我们给出所有结束日期并选择下一个(MIN)开始日期。您的数据包含重叠的间隔,因此存在EXISTS条件以排除这些END日期。第二个问题是获得第一行 - 从一天的开始到第一个START时间。
SELECT * FROM
(
SELECT End as Start,
COALESCE((SELECT MIN(Start) FROM T WHERE Start>T1.End),
DATE_ADD(DATE((SELECT MAX(END) FROM T)), INTERVAL 1 DAY)
) as End
FROM T as T1
WHERE NOT EXISTS (SELECT * FROM T
WHERE T1.End
between Start and End
and UserID<>T1.UserID )
UNION ALL
SELECT DATE(MIN(START)) as Start,
MIN(START) as End
FROM T
) as T2
ORDER BY Start