【问题标题】:SQL - Check AvailabilitySQL - 检查可用性
【发布时间】:2025-11-23 12:30:01
【问题描述】:

我正计划开发一个酒店管理系统,其中每家酒店都有/拥有特定天数的房价。速率值存储在另一个表中,这很好。

表格如下。

我用来检查特定日期范围内是否存在现有费率的 SQL 查询。

SELECT * FROM `hotel_rate` 
WHERE 
(from_date <= '2013-04-18' AND to_date <= '2013-04-22') OR
(from_date >= '2013-04-18' AND to_date >= '2013-04-22') OR
(from_date >= '2013-04-18' AND to_date <= '2013-04-22') OR
(from_date <= '2013-04-18' AND to_date >= '2013-04-22')

我正在尝试将日期范围从“2013-04-18”添加到“2013-04-22”。从“2013-04-20”到“2013-04-23”的日期范围已经添加了费率。所以我想通知正在添加费率的管理员,他/她选择的特定时期已经应用了费率。

问题是我的 SQL 查询从数据库中获取所有行,因为我只想获取速率重叠的特定行。在我的示例结果集中应该只包含 id = 4 的行。

据我所知,在添加费率之前,我应该检查以下 4 个条件。两条黑线显示酒店的现有价格。黄线显示​​可能的重叠场景。在任何给定的集合中,第一条黄线是 from_date,第二条黄线是 to_date。

我怎样才能解决这个问题 ?我怎样才能只得到重叠率行?

【问题讨论】:

  • +1 为这张照片给我的笑声。
  • 我不知道它是否有帮助,但在所有情况下,1. 第一个黄色条在第二个黑色条之前,2.第二个黄色条在第一个黑色条之后。在爱因斯坦被证明是错误的之前,这就是你需要担心的全部。

标签: mysql sql


【解决方案1】:

我不太确定我是否在关注,但您似乎想确定是否有任何记录与输入的两个日期有某种重叠。如果是这样的话,我会建议这个

SELECT * FROM `hotel_rate`
WHERE
  from_date BETWEEN ? AND ?
  OR to_date BETWEEN ? AND ?

当然,? 是您的两个日期。需要发生重叠的只是记录的 from_date 或记录的 to_date 落在输入日期(包括输入日期)之间。

【讨论】:

    【解决方案2】:

    我认为您想要以下内容:

    WHERE (from_date <= '2013-04-18' AND to_date >= '2013-04-18') OR
     (from_date <= '2013-04-22' AND to_date >= '2013-04-22') OR
     (from_date >= '2013-04-18' AND to_date <= '2013-04-22')
    

    前两个检查围绕从或到日期的任何范围。最后检查的是 2 内的任何范围。

    【讨论】:

    • Mike Brant 打败了我,他的当然更简单。不错!