MySQL 查询检查日期间隔的一部分是否包含在另一个日期间隔内

标签 mysql

给定 MySQL 表:

occupied_room_dates

id (int)     date_a (DATE)       date_b (DATE)
1            2018-12-20          2018-12-25
5            2019-01-05          2019-02-15
36           2019-01-02          2019-03-21

给定两个变量,其中包含格式为 yyyy/mm/dd 的日期字符串:

DT_A = yyyy/mm/dd (Example: 2019-02-03)
DT_B = yyyy/mm/dd (Example: 2019-05-03)

我想执行查询来检查对于给定的 DT_A 和 DT_B(即 DT_A < DT_B),表占用_房间_日期中至少有一行的日期间隔为:

a) [日期_a - 日期_b]
b) [DT_A - DT_B]

相互重叠。

示例/期望:

在示例中,对于 ROOM_ID = 36,它应该返回示例表中的第三行,因为日期间隔重叠。

再举一个例子(ROOM_ID = 36、DT_A = 2019-06-15、DT_B = 2019-07-15)应该没有匹配项,因为没有日期间隔与其重叠。

到目前为止我尝试过的是:

由于重叠发生的通用方式有四种,因此我创建了 4 个触发警报的条件:

"SELECT `date_a`,`date_b` FROM `occupied_room_dates`
WHERE `id`='".ROOM_ID."' AND 
(
    (`date_a`<='".DT_A."' AND `date_b`>='".DT_A."')
    OR (`date_a`<='".DT_B."' AND `date_b`>='".DT_B."')
    OR (`date_a`>='".DT_A."' AND `date_b`<='".DT_B."')
    OR (`date_a`<='".DT_A."' AND `date_b`>='".DT_B."')

) LIMIT 1"

但是在包含大量行的真实表上尝试此操作,它无法按预期工作。我在可视化所有必须满足的条件以及在单个 MySQL 查询中表示这些条件时遇到了麻烦。

其背后的目的是检查房间在某个日期间隔内是否被占用。您能帮我查询一下吗?

最佳答案

说明:

你的代码看起来很正确。但由于您只有一张表中的数据,因此不需要 Where ID = "Room_ID" 。我不明白你到底想从 3 列中输出什么,所以我做了 Select *,如果你只想要 RoomID,请使用 SELECT id FROM占用的房间日期 代替。

代码:

SELECT * FROM occupied_room_dates
WHERE (date_a<="2019-02-03" AND date_b>="2019-02-03")
    OR (date_a<="2019-05-03" AND date_b>="2019-05-03")
    OR (date_a>="2019-02-03" AND date_b<="2019-05-03")
    OR (date_a<="2019-02-03" AND date_b>="2019-05-03")

关于MySQL 查询检查日期间隔的一部分是否包含在另一个日期间隔内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53934487/

相关文章:

php - 将数据添加到数组中的每个元素 -> JSON

mysql - Mariadb 5.5 比 MySQL 5.1 慢

MySQL 日期时间算法

PHP/MySQL 每周轮值表

php - 文件上传空字符串

用于识别相同文件的 Java 文件哈希

mysql - MySql 选择所需的指导

mysql - 搜索多个具有相同结构的表

MySQL GROUP BY YEARWEEK 获取第一个和最后一个不起作用

mysql - 在数据库中存储位置数据