示例:
我有一个酒店,需要建一个表格,在那里我可以看到房间,这些房间在特定时间没有拍摄。
单个Bookins保存在SQL数据库表中:
room start end
1 2017-09-01 2017-09-10
2 2017-09-12 2017-09-15
1 2017-09-01 2017-09-10
现在我需要所有房间,例如客户可以在2017-09-10至2017-09-11之间获得房间。
我尝试构建一个SQL查询,如:
SELECT * FROM rooms WHERE room_id NOT IN (
SELECT room_id FROM bookings WHERE start <= #startTime# AND end >= #endTime#
)
但结果并不可靠。我想,我不是第一个提出此问题的人,但我找不到谷歌博士的任何信息。
答案 0 :(得分:1)
您似乎没有符合条件的数据:
DECLARE @Rooms TABLE (Room_Id INT, Room VARCHAR(50) );
DECLARE @Bookings TABLE (Room_Id INT, StartDate DATE, EndDate DATE);
/**/
INSERT INTO @Rooms VALUES
(1,'Room1'),
(2,'Room2'),
(3,'Room3');
INSERT INTO @Bookings VALUES
(1, '2017-09-01', '2017-09-10'),
(2, '2017-09-12', '2017-09-15'),
(1, '2017-09-01', '2017-09-10');
SELECT *
FROM @Rooms
WHERE Room_Id NOT IN (SELECT Room_Id FROM @Bookings WHERE StartDate <= '2017-09-12' AND EndDate >= '2017-09-15' );
结果:
+=========+=======+
| Room_Id | Room |
+=========+=======+
| 1 | Room1 |
+---------+-------+
| 3 | Room3 |
+---------+-------+
答案 1 :(得分:1)
我相信你很亲密。您目前正在抓住预订开始时间或等于您的开始时间且预订结束时间大于或等于结束时间的所有房间。虽然这有效,但它不包括在指定预订时间内开始的预订,也不包括在指定预订时间内结束的预订。
为了捕获这些条目,您只需在参数中切换变量的顺序。您想要检查在结束时间之前开始的预订,以及在开始时间之后结束的预订。这将涵盖与您搜索的时段重叠的任何预订。
DECLARE @start DATE = '2017-09-11',
@end DATE = '2017-09-13'
SELECT * FROM rooms WHERE room_id NOT IN (
SELECT room_id FROM bookings WHERE start <= @end AND end >= @start
)
例如,如果您有以下值:
room start end
1 2017-09-01 2017-09-10
2 2017-09-12 2017-09-15
1 2017-09-01 2017-09-10
3 2017-09-09 2017-09-12
4 2017-09-14 2017-09-17
5 2017-09-13 2017-09-17
您的查询使用@start = '2017-09-11'
和@end = '2017-09-13'
以下房间有效(假设如上所示有5个房间):1, 4
答案 2 :(得分:0)
试试这个。已移除Sub Query
SELECT R.*
FROM @Rooms R, @Bookings B
WHERE R.room_id <> B.room_id
AND B.StartDate <= '2017-09-12'AND B.EndDate >= '2017-09-15'
--Using Inner Join
SELECT R.*
FROM @Rooms R
INNER JOIN @Bookings B ON R.room_id <> B.room_id
WHERE B.StartDate <= '2017-09-12'AND B.EndDate >= '2017-09-15'