及时找到空的空间

时间:2014-06-17 13:42:03

标签: mysql sql database

我想找到一段时间不用的时间段。 例如,给出下表:

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

1 个答案:

答案 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

SQLFiddle demo