我见过很多与此类似的问题,但它们似乎都是为了突出显示日期范围重叠时而设计的,我需要相反的问题。
假设我有一张这样的 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/