在给定时间段

时间:2017-10-13 03:07:34

标签: mysql sql

这是表预订的屏幕截图 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检查可用房间时,它会失败。

4 个答案:

答案 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 */)中选择。