【问题标题】:Find free room (booking system)查找空闲房间(预订系统)
【发布时间】:2012-01-08 17:56:55
【问题描述】:

对于预订系统,我有一张桌子,上面有房间、到达和离开。

示例数据:

id | room | arrival    | departure
---+------+------------+-----------
1  | 1    | 2011-03-12 | 2011-03-14
2  | 1    | 2011-03-08 | 2011-03-09
3  | 1    | 2011-03-19 | 2011-03-20
4  | 2    | 2011-03-22 | 2011-03-30 
5  | 2    | 2011-03-19 | 2011-03-22

我现在的问题是:如果我有新的预订(2011-03-102011-03-12),我如何查看哪些房间是免费的?

此示例的输出应为房间 12

【问题讨论】:

  • 房间 3,4 和 5 似乎也可用。 (--> 你需要一张额外的桌子,基本上是现有房间的列表)
  • 好吧,你是对的......我还有这张桌子

标签: mysql


【解决方案1】:

这是一个查询,它将显示某个日期范围内的 NOT-FREE 房间:

select room from bookings where
(arrival<'2011-03-12' and departure>='2011-03-12') -- overlap at the end
OR (arrival<='2011-03-10' and departure>'2011-03-10') -- overlap at the start
OR (arrival>='2011-03-10' and departure<='2011-03-12') -- complete overlap

你可以用这个

select roomnumber from rooms where roomnumber not in (... as above ...)

寻找免费房间

【讨论】:

  • 完美...非常好 :) 我刚刚在第一条语句中添加了 DISTINCT
  • 这可以扩展为 select count(*) as num, room from bookingds ... 按房间分组:这样它会告诉你冲突的数量 - 如果你的酒店很满,一个低数量的碰撞可能表明通过房间交换逃脱的可能性。 (只是对你的 DISTINCT 进行头脑风暴)
  • 我遇到了一个非常相似的问题,并提出了您的解决方案。正在寻找其他想法,然后当我看到你的答案时笑了。正是我在做什么。酷:D
【解决方案2】:

您也可以为此目的使用BETWEEN 比较运算符。在这种情况下,你会做这样的事情:

SELECT r.id FROM room r WHERE r.id NOT IN
(
    SELECT rb.room FROM room_booking rb WHERE 
        ('2011-03-10' BETWEEN rb.arrival AND rb.departure) OR 
        ('2011-03-12' BETWEEN rb.arrival AND rb.departure)
)

【讨论】:

  • 此查询将无法检测到完全重叠:如果房间是在 2011-03-10 到 2011-03-12 预订的,那么您对 ​​2011-03-08 到 2011-03-14 的查询将将房间显示为空闲,即您只更改开始和结束时的重叠部分,而不是完全重叠部分。
  • 这是真的,我会这样做:('2011-03-10' + INTERVAL 1 DAY) BETWEEN arrival AND departure AND ('2011-03-12' - INTERVAL 1 DAY) BETWEEN arrival AND departure
猜你喜欢
  • 2010-10-21
  • 1970-01-01
  • 2017-09-19
  • 2012-03-27
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多