MySQL-查找具有重叠期间的记录
Posted
技术标签:
【中文标题】MySQL-查找具有重叠期间的记录【英文标题】:MySQL- Find records with overlapping period 【发布时间】:2021-12-21 05:08:32 【问题描述】:我有一张桌子 hotel_booking
reference | start_date | numberOfDays |
---|---|---|
ABC | 11-08-2021 | 2 |
DEF | 12-08-2021 | 2 |
GHI | 13-08-2021 | 3 |
JKL | 10-08-2021 | 2 |
所以我想要的第一个任务是获取所有 startDate 在 x 和 y 日期之间的预订,这是直接查询
select reference
from hotel_booking
where DATE(start_date) BETWEEN '2021-08-11' AND '2021-08-12'
这返回了完美的 ABC 和 DEF。
现在我想根据 numberOfdays 检查所有具有重叠期间的预订
例如,根据 numberOfDays 获取 startDate 和 endDate 提到的期间内的所有预订
输入:例如,如果 startDate 是 11-08-2021,endDate 是 12-08-2021 那么
预期输出:返回的预订是 JKL、ABC 和 DEF,因为 JKL 有 2 天的预订,这将与 startDate 11-08-2021 重叠
任何指针将不胜感激
【问题讨论】:
您还需要指定预期结果。 我已经提到了..我会说得更清楚 【参考方案1】:由于您没有保存结束日期,因此您需要将其计算为 start_date + interval numberOfDays days
以获得唯一的结束日期。日期重叠查询如下所示:
SELECT *
FROM t
WHERE @d2 > start_date AND (start_date + interval numberOfDays day) > @d1
-- In order to check [2021-08-11, 2021-08-12]
-- You will set @d1 and @d2 to 2021-08-11 and 2021-08-13
为完整起见,以下是包含结束日期的版本:
SELECT *
FROM t
WHERE @d2 >= start_date AND (start_date + interval numberOfDays - 1 day) >= @d1
-- In order to check [2021-08-11, 2021-08-12]
-- You will set @d1 and @d2 to 2021-08-11 and 2021-08-12
【讨论】:
谢谢.. 可以@d2 >= DATE(start_date) 然后根本不更改结束日期吗? 您想按原样使用[2021-08-11, 2021-08-12]
?
是的,用于比较的 startDate 和 endDate 将是这两个日期。因此,当它与 8 月 11 日和 12 日的唯一预订完全匹配时(第一次查询),并且如果要针对间隔内的所有预订进行检查,那么您的查询就会出现
查看修改后的答案。基本上>
都必须更改为>=
并且结束日期必须是开始日期 + (n - 1) 天。以上是关于MySQL-查找具有重叠期间的记录的主要内容,如果未能解决你的问题,请参考以下文章