2014-04-28 73 views
1

我正在構建酒店預訂系統,並且在嘗試進行查詢以檢索給定範圍內的所有可用房間類型時,我只是陷入了困境。選擇指定日期範圍內的可用房間

我有兩個表RoomsReservationsRooms桌上放置着酒店的房間。他們的編號(id)和他們的類型(type)。

Reservations包含客戶端預訂。預約數(id),相關的房號(room_id)和日期範圍(fromto

我曾嘗試此查詢:

SELECT room_id as available_room_number, type 

FROM roomstesting 

LEFT JOIN reservations ON roomstesting.id = reservations.room_id 
WHERE reservations.id 
    NOT IN (reservations.e_from <='"2014-03-07 19:00:00' 
      AND reservations.e_to >='2014-03-08 19:00:00') 

我試圖讓所有可用房間類型範圍從3月7日到3月8日。我期待得到modern room作爲查詢的結果。因爲modern room id 4沒有與日期範圍重疊的保留,所有其他3個房間都有保留從3月6日至3月9日。但我沒有得到我想要的結果。下面是我的數據庫(簡化)

房間結構

| id | type   | 
||||||||||||||||||||| 
| 1 | master suite | 
| 2 | master suite | 
| 3 | modern room | 
| 4 | modern room | 

預訂

| id | room_id | from    | to     | 
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 
| 1 | 1 | 2014-03-05 08:00:00 | 2014-03-09 08:00:00 | 
| 2 | 2 | 2014-03-05 08:00:00 | 2014-03-09 08:00:00 | 
| 3 | 3 | 2014-03-05 08:00:00 | 2014-03-09 08:00:00 | 

預期結果

| available_room_number | type  | 
|||||||||||||||||||||||||||||||||||||| 
|   4   | modern room| 

如果有人在這裏可以告訴我,我應該怎麼處理這那將是完美的。期待您的回覆。

回答

1

試試這個:

SELECT * FROM Rooms WHERE ID NOT IN(SELECT room_id FROM reservations WHERE '2014-03-07 19:00:00' < e_to AND '2014-03-08 19:00:00' > e_from) 
+0

YAY?這適用於在該範圍內開始/結束的所有預訂,但不考慮在範圍之外開始和結束的預訂。我已經調整了這個SELECT SELECT room_id FROM reservations WHERE'2014-03-07 19:00:00' e_from'它起作用。如果你能編輯你的答案,很高興接受它。 –

+0

現在呢? – ericpap

1

爲什麼不扭轉的跡象比較

WHERE reservations.e_from> '2014年3月7日19:00:00' 和reservations.e_to < '2014年3月8日19:00:00'

1

室4沒有預約,所以它不是由JOIN回升。嘗試是這樣的:

SELECT room_id, type 
FROM  roomstesting 
WHERE  room_id NOT IN (
      SELECT reservations.room_id 
      FROM  reservations 
      WHERE  (
          reservations.e_from <= '2014-03-07 19:00:00' AND 
          reservations.e_to >= '2014-03-08 19:00:00' 
         ) OR (
          reservations.e_from <= '2014-03-07 19:00:00' AND 
          reservations.e_to < '2014-03-08 19:00:00' 
         ) OR 
         (
          reservations.e_from > '2014-03-07 19:00:00' AND 
          reservations.e_to >= '2014-03-08 19:00:00' 
         ) OR 
         (
          reservations.e_from > '2014-03-07 19:00:00' AND 
          reservations.e_to < '2014-03-08 19:00:00' 
         ) 
         ) 
0

我總是嘗試使用BETWEEN和它的作品

select * from roomstesting 
where room_id not in 
(select room_id from roomstesting where date between begin_date and end_date)