2

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

表如下。

在此处输入图像描述

我用来检查特定日期范围内是否存在现有费率的 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。

在此处输入图像描述 我怎样才能解决这个问题 ?我怎样才能得到重叠率行?

4

2 回答 2

1

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

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

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

于 2013-04-18T16:41:45.397 回答
0

我认为您想要以下内容:

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 内的任何范围。

于 2013-04-18T16:44:21.560 回答