2013-04-17 93 views
0

我在我的數據庫中有一個名爲房間的表格,其中包含房間信息和屬性,另一個名爲預訂表格的表格包含Room Reserved,FromDate和ToDate。SQL按日期篩選可用房間

我想要做的是讓用戶選擇他想要預訂的房間大小並選擇預訂房間的日期,然後我向他提供可用房間取決於房間預訂表。

這裏我做了什麼:

SELECT * FROM Rooms,Reservations WHERE 
Rooms.R_Size = 'roomSize' AND ('4/19/2013' NOT 
BETWEEN Reservation.FromDate AND Reservation.ToDate AND '4/19/2013' 
NOT BETWEEN Reservation.FromDate AND Reservation.ToDate) 

客房即使其返回給我重複的問題在具體的保留的保留日期,但之間的它不是在另一個保留保留日期間仍然會返回給我。

我想要的是檢查房間是否保留在相同或特定日期之間,以及是否我不希望它被選中並返回。

謝謝..對不起我可憐的英語

回答

1

查詢有兩個問題。一種是房間和預訂之間沒有連接條件,這樣對於每個滿足日期測試的預訂,正確尺寸的房間將被返回一次。另一個問題是您的日期測試是錯誤的,因爲它不會檢測到完全在新預訂的日期間隔內的現有預訂。

像這樣的查詢應該給你結果你想:

SELECT * FROM Rooms 
LEFT JOIN Reservations 
ON Reservations.R_Number = Rooms.Number 
AND Reservations.ToDate > '4/19/2013' 
AND Reservations.FromDate < '4/20/2013' 
WHERE Rooms.R_Size = 'roomSize' 
AND Reservations.R_Number IS NULL 

它通過加入房間的預訂那個房間,然後選擇客房其中有沒有保留的衝突隨着新的保留被制定(舊的保留在新保留開始之前結束,或者在新結束之後開始沒有問題)。

1

你在這裏做的是一個交叉連接。表a(房間)中的每一行都與表b(預訂)中的每一行相連。

爲了使您的查詢工作,您需要在您的where子句中指定Rooms.Rooms_Key = Reservations.Rooms_ForignKey(或顯式連接[inner,left,right]並指定ON字段,因爲它們更容易請閱讀我的意見 - explicit-vs-implicit瞭解更多信息)。

一旦你轉換了連接類型,where子句將開始給你更好的結果,如果你仍然需要在那一點上,你應該能夠修改它。