这是表预订的屏幕截图 bookin
这是查询即时使用,
SELECT * FROM BOOKINGS WHERE not
CheckIn >= '01:00:00' and CheckOut <= '02:00:00' and
CheckOut <= '01:00:00' and CheckIn <= '01:00:00' or
CheckIn >= '02:00:00'
当我给出特定时间段时,我想要返回该给定时间段内的所有可用房间。
示例 - 我希望从下午1点到下午2点获得所有可用的房间,我应该只获得房间104.但我得到101房间可用。 101房间预订从下午1点到下午2点,另一个预订从下午2点到下午3点。该查询忽略了下午2点到下午3点的预订,并将其显示为可用。
这是上述查询的屏幕截图 query result
结果是错误的,101室无法使用
我想要的输出是,当我给出一段时间我想要返回所有可用房间的例子
test a: 1pm to 2pm available rooms 103 and 104
test b: 1.30pm to 2pm available rooms 103 and 104
test c: 1.30pm to 2.30pm available rooms 104
test d: 1.00pm to 2.30pm available rooms 104
我想知道如何解决问题,以及需要什么样的方法。我还使用了连接语句和一个存储房间号的单独表格,但仍然没有运气。
上表创建的代码 -
CREATE TABLE `bookings` (
`BookingID` int(11) NOT NULL,
`RoomID` int(11) DEFAULT NULL,
`CheckIn` time DEFAULT NULL,
`CheckOut` time DEFAULT NULL
);
INSERT INTO `bookings` (`BookingID`, `RoomID`, `CheckIn`, `CheckOut`)
VALUES
(1, 101, '01:00:00', '02:00:00'),
(2, 101, '02:00:00', '03:00:00'),
(3, 103, '02:00:00', '03:00:00'),
(4, 104, '03:00:00', '04:00:00');
修改
以下查询适用于上述方案
SELECT * FROM BOOKINGS WHERE RoomID NOT IN
(
SELECT RoomID FROM BOOKINGS WHERE
( CheckIn >= '01:30:00' and CheckIn < '03:30:00') or
( CheckIn < '01:30:00' and CheckOut >= '03:30:00')
)
编辑2 当上述查询用于从下午2:30到下午3:30检查可用房间时,它会失败。
答案 0 :(得分:1)
无论您是只想查看单个查询,还是可以为动态查询创建函数。
但逻辑应该是这个 -
假设您要检查checkIN = start_time和checkOUT = end_time,
的可用性SELECT * FROM BOOKINGS WHERE RoomID NOT IN
(
SELECT RoomID FROM BOOKINGS WHERE
( CheckIn >= start_time and CheckIn < end_time) or
( CheckIn < start_time and CheckOut > end_time)
)
答案 1 :(得分:0)
在这里你可以使用这样的东西 -
SELECT * FROM BOOKINGS WHERE RoomID NOT IN
(
SELECT RoomID FROM BOOKINGS WHERE
( CheckIn >= '01:00:00' and CheckIn < '02:00:00') or
( CheckIn < '01:00:00' and CheckOut > '02:00:00')
)
不要忘记使用括号,使用它们总是更好。
这里,逻辑首先在子查询中我们选择所有在1:00:00-2:00:00之间预订的RoomID,然后我们在外部查询中排除房间并显示剩余房间< / p>
对于您的问题,对于每个测试用例,您需要不同的查询吗?
对于测试a:上面的代码就是答案。
对于测试b:
SELECT * FROM BOOKINGS WHERE RoomID NOT IN
(
SELECT RoomID FROM BOOKINGS WHERE
( CheckIn >= '01:30:00' and CheckIn < '02:00:00') or
( CheckIn < '01:30:00' and CheckOut > '02:00:00')
)
对于测试c:
SELECT * FROM BOOKINGS WHERE RoomID NOT IN
(
SELECT RoomID FROM BOOKINGS WHERE
( CheckIn >= '01:30:00' and CheckIn < '02:30:00') or
( CheckIn < '01:30:00' and CheckOut > '02:30:00')
)
同样,对于测试d:
SELECT * FROM BOOKINGS WHERE RoomID NOT IN
(
SELECT RoomID FROM BOOKINGS WHERE
( CheckIn >= '01:00:00' and CheckIn < '02:30:00') or
( CheckIn < '01:00:00' and CheckOut > '02:30:00')
)
答案 2 :(得分:0)
首先找到在所需时间范围内忙碌的房间,并将它们从酒店的所有房间列表中排除。它应该给你所需的结果。
这是oracle查询。
select roomid from bookings where roomid not in (
select roomid from bookings where '13-10-17 01:15:00' between checkin and checkout );
答案 3 :(得分:0)
这里的逻辑看似简单。
要找到有冲突/重叠的时间窗口,您需要在所需的结尾之前找到<<>> 时间 时间的条目>时间,以及在 所需的开始时间之后的 时间。你比较从头到尾,而不是开始或结束。
这看起来似乎没有测试足够的条件,但这就是你所需要的。考虑这种简单的语言解释:
如果您在退房之前办理登机手续,和如果我在结账前办理登机手续,那么我们必须同时在这里。否则,我们一定不会。
因此,要找到所有预订时间从01:00:00到02:30:00与预订建议相冲突的房间......
SELECT DISTINCT RoomID FROM bookings
WHERE CheckIn < '02:30:00'
AND CheckOut > '01:00:00';
http://sqlfiddle.com/#!9/341305/14
要查找可用的房间,您可以从房间表WHERE RoomID NOT IN (/* the query above */)
中选择。