给定 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/