SQL - 检查可用性

时间:2013-04-18 16:36:30

标签: mysql sql

我计划开发一个酒店管理系统,每个酒店都有特定天数的费率。费率值存储在另一个表中,这很好。

表格如下。

enter image description here

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')

我要做的是添加日期范围的费率来自&#39; 2013-04-18&#39;到2013-04-22&#39;。已经添加了“2013-04-20&#39;”日期范围的费率。到2013-04-23&#39;。因此,我想告知管理员,他们已经在他/她选择的特定时间段内添加了已经应用的费率。

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

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

enter image description here 我怎样才能解决这个问题 ?我怎样才能获得重叠的费率行?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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中的任何范围。