2013-04-17 92 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子句将开始给你更好的结果,如果你仍然需要在那一点上,你应该能够修改它。