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-查找具有重叠期间的记录的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中查找具有重复记录的 id

如何根据关键和时间间隔有效地查找父记录?

MySQL查找具有相同customerid且具有两个不同值的记录

Rails:查找重叠的记录

如何使用开始和结束日期时间在司机的行程中查找重叠记录

查找不同行中日期时间间隔的重叠?