2013-09-21 69 views
0

我試圖找到2個日期時間字段之間的預訂系統的具體時間匹配的空閒時間,但我困住了正確的查詢。Mysql查找預約系統約會之間的空閒時間(插槽)

我的分貝活動:


+----------+---------------------+---------------------+---------+ 
| Event_ID | StartTime   | EndTime    | Pers_ID | 
+----------+---------------------+---------------------+---------+ 
|  3 | 2013-09-21 16:00:00 | 2013-09-21 16:30:00 |  6 | 
|  21 | 2013-09-21 09:00:00 | 2013-09-21 09:15:00 |  6 | 
|  5 | 2013-09-21 09:15:00 | 2013-09-21 10:15:00 |  6 | 
|  64 | 2013-09-21 15:00:00 | 2013-09-21 15:45:00 |  6 | 
|  32 | 2013-09-21 10:15:00 | 2013-09-21 11:30:00 |  6 | 
|  6 | 2013-09-21 13:00:00 | 2013-09-21 14:45:00 |  6 | 
+----------+---------------------+---------------------+---------+ 

結果必須是75分鐘Pers_ID = 6的自由可能時隙2013年9月21日2013年9月21日9點00分零零秒至22:00之間與:00,和他們也不得不開始已經在數據庫中的結束時間

已經感謝您的幫助,
E-RASER之後

+0

表中包含多少條記錄? –

+0

你好雷蒙德, + - 5000個記錄 ,每天 溴約20 receords, E-RASER –

回答

0
SELECT AvailStartTime, AvailEndTime 
FROM (
    SELECT @lastEndTime as AvailStartTime, StartTime as AvailEndTime, @lastEndTime := EndTime 
    FROM (SELECT StartTime, EndTime 
      FROM Events 
      WHERE Pers_ID = 6 
      AND EndTime >= '2013-09-21 09:00' 
      AND StartTime < '2013-09-21 22:00' 
      ORDER BY StartTime) e 
    JOIN (SELECT @lastEndTime := NULL) init) x 
WHERE AvailEndTime > DATE_ADD(AvailStartTime, INTERVAL 75 MINUTE) 

DEMO

+0

@ E-RASER PRIMARY KEY(事項標識),KEY(Pers_ID,開始時間,結束時間),你需要這些指標,因此需要兩個完整的表掃描,而不是三個,但這仍然不是很好,如果你的表很大 –

+0

嗨@Barmar,感謝您的幫助,但仍有一些錯誤,在[這個例子](http://sqlfiddle.com/# !2/d743c/18)我找了30分鐘的時間片,應該有以下插槽:從9點15分開始,從11點30分開始,最後一點從16點30分開始,但是最後一個不見了。 –

+0

它只能在兩個事件之間找到插槽,因爲它將每一行與下一行進行比較以查看是否有空間。它不會在上次事件之後或第一次之前找到插槽,因爲沒有任何可比較的地方。 – Barmar