我计划开发一个酒店管理系统,每个酒店都有特定天数的费率。费率值存储在另一个表中,这很好。
表格如下。
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。
我怎样才能解决这个问题 ?我怎样才能获得重叠的费率行?
答案 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中的任何范围。