MySQL 获取不重叠的日期范围

标签 mysql

我见过很多与此类似的问题,但它们似乎都是为了突出显示日期范围重叠时而设计的,我需要相反的问题。

假设我有一张这样的 table

id| start_date | end_date   | room_id
1 | 15/05/2018 | 30/06/2020 | 1
2 | 01/11/2018 | 31/10/2019 | 2
3 | 01/08/2020 | 31/07/2022 | 1
4 | 01/12/2019 | 30/11/2021 | 2
5 | 01/08/2020 | 31/07/2022 | 3

如您所见,每个房间都有多个预订。我需要能够指定一个开始/结束日期或两者,并返回不重叠的内容(即可用房间)

例如,如果我仅指定开始日期 01/05/2018,则每个房间都会返回,或者如果我仅指定结束日期 30/07/2020,则每个房间都会返回,因为这两个日期都不是每次预订的开始日期和结束日期之间。即使 ID 1 的预订于 2020 年 6 月 30 日结束,而新预订于 2020 年 8 月 1 日开始,它仍然可用,因为有人可以在这 2 个日期之间进行预订。

如果我同时指定了开始日期和结束日期,它会搜索并仅返回在这两个日期之间根本没有预订的房间。

我在网上阅读了很多问题,逻辑似乎是

SELECT *
FROM bookings
WHERE $start_date < expiry_date AND $end_date > start_date

我明白,但是如果我使用以下日期运行上面的查询

SELECT *
FROM bookings
WHERE '2018-10-01' < expiry_date AND '2019-10-01' > start_date

返回

id| start_date | end_date   | room_id
1 | 15/05/2018 | 30/06/2020 | 1
2 | 01/11/2018 | 31/10/2019 | 2

如何获取它,以便当我传递开始日期、结束日期或两者时,它会返回可用的房间?

最佳答案

根据德摩根定律,我们可以否定您给出的重叠范围查询,如下所示:

SELECT *
FROM bookings
WHERE $start_date >= expiry_date OR $end_date <= start_date;

表达式~(P ^ Q)相当于~P V ~Q

关于MySQL 获取不重叠的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51988402/

相关文章:

mysql - 无法在 Windows 7 64 位上安装 openproject - Fiddle :Module 的未定义方法 `dlopen'

mysql - 在 OS X Mavericks 上使用 XAMPP 时访问被拒绝

javascript - 将新数据添加到数据库后更新下拉列表

PHP PDO 在不同的函数中连接和关闭连接

mysql - 输出数据自激活之日起一年以上

mysql - 如何在sql中将两行中的某些属性合并为一行?

php - checkout.php 没有从managecart.php 获取值(value)

php - 文本换行在 div 中 - 示例

php - 从 $var 外部剥离 "

mysql - 如何只更新时间戳的日期部分?