2014-06-17 31 views
-4

我希望找到一段時間沒有被佔用的可用時間段。例如,給定下表:及時查找空餘時間

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

對不起,我不是很熟悉SQL,但我需要這個程序我建立的,因此任何提示或幫助將appriciated – user3309825

+5

我們不打算寫下你的所有代碼。首先嚐試一下,當你有一個特定的問題*然後*回來問。 –

+0

我不是一直在尋找代碼。任何提示或思考過程都會很好,因爲我有點卡住了 – user3309825

回答

2

該查詢由UNION的兩個查詢組成。第一個:我們給所有END日期並選擇下一個(MIN)開始日期。您的數據包含重疊的時間間隔,因此存在排除這些END日期的EXISTS條件。第二個查詢是獲取第一行 - 從一天的開始到第一個開始時間。

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