我正在尝试用.NET做一个预订系统。我有一个数据库,里面有一个叫做Booking、房间和BookingRoom的表。
Room包含Room.RoomID形式的房间号。BookingRoom只有两列: RoomID和BookingID。Booking有几个列,但我想使用的是CheckInDate和CheckOutDate以及BookingID的列。
-> BookingRoom -> Booking
这就是我现在的位置:
SELECT DISTINCT r.RoomID
FROM Room r
RIGHT JOIN BookingRoom br ON br.RoomID = r.RoomID
RIGHT JOIN Booking b ON b.BookingID = br.BookingID
RIGHT JOIN Rates ra ON r.RateID = ra.RateID
WHERE (b.CheckInDate < '2015/06/21 00:00:00' OR b.CheckInDate > '2015/06/27 23:59:59.999') AND (b.CheckOutDate < '2015/06/27 00:00:00' OR b.CheckOutDate > '2015/06/21 23:59:59.999');不幸的是,这给了我一个所有房间的列表,因为虽然它排除了该范围内的房间,但房间号与它在外部的另一个预订相匹配。
现在我再也想不出是否可以返回一个房间列表,不包括那些在CheckInDate和CheckOutDate范围内匹配日期的房间。
发布于 2015-06-24 09:01:49
您可以使用NOT EXISTS
SELECT
r.RoomID
FROM Room r
WHERE
NOT EXISTS(
SELECT 1
FROM Booking b
INNER JOIN BookingRoom br
ON br.BookingID = b.BookingID
WHERE
(b.CheckInDate < '2015/06/21 00:00:00' OR b.CheckInDate > '2015/06/27 23:59:59.999')
AND (b.CheckOutDate < '2015/06/27 00:00:00' OR b.CheckOutDate > '2015/06/21 23:59:59.999')
AND br.RoomID = r.RoomID
)发布于 2015-06-24 09:02:36
如果我没记错的话,您想要一段时间内没有预订的房间。一种相当直接的方法是使用EXISTS
SELECT r.*
FROM Room r
WHERE NOT EXISTS (SELECT 1
FROM BookingRoom br JOIN
Booking b
ON b.BookingID = br.BookingID
WHERE b.CheckInDate < '2015-06-28' AND
b.CheckOutDate >= '2015-06-21'
)请注意,我更改了日期算法,以便它可以找到任何重叠。
https://stackoverflow.com/questions/31015877
复制相似问题