我见过这么多类似的问题,但它们似乎都是为了突出显示日期范围重叠时,我需要相反的。
假设我有一张这样的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
如您所见,每个房间都有多个预订。我需要能够指定一个开始/结束日期,或者两者都指定,并获取不重叠的内容(即可用房间)
例如,如果我只指定了2018年5月1日的开始日期,则每个房间都将返回,或者如果我只指定了2020年7月30日的结束日期,则每个房间都将返回,因为这两个日期都不在每次预订的开始日期和结束日期之间。尽管id 1的预订日期为2020年6月30日,新的预订日期为2020年8月1日,但它仍然可以使用,因为有人可以在这两个日期之间预订。
如果我同时指定了开始日期和结束日期,它将搜索并只返回在这两个日期之间没有预订的房间。
我在网上读了很多问题,逻辑似乎是
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
我如何得到它,以便当我传递开始日期、结束日期或两者都返回可用的房间?
1条答案
按热度按时间vs3odd8k1#
根据de morgan定律,我们可以否定您给出的重叠范围查询,如下所示:
表达式
~(P ^ Q)
相当于~P V ~Q
.