MySQL: NOT BETWEEN 未按预期运行
MySQL: NOT BETWEEN not behaving as expected
我有一个预订系统,我必须检查日期 或 日期范围 不在 MySQL.
中保存的日期范围之间
这是我的 table:
bookings(id, property_id, booked_from_date, booked_to_date)
每个属性可以预订一个或多个日期none。
我要检查某个日期或范围是否不在预订期间之一之间的查询是
SELECT p.id, p.title
FROM properties p
LEFT JOIN bookings b ON p.id = b.property_id
WHERE
COALESCE('selected_from_date' NOT BETWEEN p.booked_from_date AND b.booked_to_date , TRUE) AND
COALESCE('selected_to_date' NOT BETWEEN p.booked_from_date AND b.booked_to_date , TRUE)
GROUP BY main.id
我的逻辑是,如果某个日期不在预定范围内,那么它是可用的,但查询没有 return 正确的结果。
是否有任何方法可以排除在这些日期之间可用的所有属性?
谢谢
编辑
这里是 table,其中包含预订的范围
id boat_id booking_id booked_from_date booked_to_date
5 22 NULL 2016-05-28 2016-06-04
6 22 NULL 2016-07-02 2016-07-09
7 22 NULL 2016-07-16 2016-07-23
9 25 NULL 2016-06-04 2016-06-11
这是父table
id title
21 Vacanza tra comfort e benessere su barca a vela ad...
22 Vacanza in Barca a Vela su Gib Sea 372
23 Vacanza da sogno su un Motor Yacht
24 Capri & Costiera Amalfitana
25 Golfo di Napoli in barca a vela
26 Il 44 piedi che sorprende
我的期望:
如果我搜索 2016-05-30
我希望 return 除 id 22
之外的所有船只,因为日期 2016-05-30
在已经预订的范围内.
如果我搜索从 2016-06-05
到 2016-06-10
我希望 return 除 id 25
[=60= 之外的所有船只]
希望这对您有所帮助
此查询将从 properties
中查找所有未预订的项目。主要思想是搜索预订的项目(并将其放置在 JOIN bookings
中)。然后使用 WHERE bookings.id IS NULL
将 JOIN
转换为 LEFT JOIN
- 它会将条件从 booked
反转为 not booked
。
SELECT p.id, p.title
FROM properties p
LEFT JOIN bookings b ON p.id = b.property_id
AND b.booked_from_date <= 'selected_to_date'
AND b.booked_to_date >= 'selected_from_date'
WHERE b.id IS NULL
我有一个预订系统,我必须检查日期 或 日期范围 不在 MySQL.
中保存的日期范围之间这是我的 table:
bookings(id, property_id, booked_from_date, booked_to_date)
每个属性可以预订一个或多个日期none。
我要检查某个日期或范围是否不在预订期间之一之间的查询是
SELECT p.id, p.title
FROM properties p
LEFT JOIN bookings b ON p.id = b.property_id
WHERE
COALESCE('selected_from_date' NOT BETWEEN p.booked_from_date AND b.booked_to_date , TRUE) AND
COALESCE('selected_to_date' NOT BETWEEN p.booked_from_date AND b.booked_to_date , TRUE)
GROUP BY main.id
我的逻辑是,如果某个日期不在预定范围内,那么它是可用的,但查询没有 return 正确的结果。
是否有任何方法可以排除在这些日期之间可用的所有属性?
谢谢
编辑
这里是 table,其中包含预订的范围
id boat_id booking_id booked_from_date booked_to_date
5 22 NULL 2016-05-28 2016-06-04
6 22 NULL 2016-07-02 2016-07-09
7 22 NULL 2016-07-16 2016-07-23
9 25 NULL 2016-06-04 2016-06-11
这是父table
id title
21 Vacanza tra comfort e benessere su barca a vela ad...
22 Vacanza in Barca a Vela su Gib Sea 372
23 Vacanza da sogno su un Motor Yacht
24 Capri & Costiera Amalfitana
25 Golfo di Napoli in barca a vela
26 Il 44 piedi che sorprende
我的期望:
如果我搜索
2016-05-30
我希望 return 除id 22
之外的所有船只,因为日期2016-05-30
在已经预订的范围内.如果我搜索从
[=60= 之外的所有船只]2016-06-05
到2016-06-10
我希望 return 除id 25
希望这对您有所帮助
此查询将从 properties
中查找所有未预订的项目。主要思想是搜索预订的项目(并将其放置在 JOIN bookings
中)。然后使用 WHERE bookings.id IS NULL
将 JOIN
转换为 LEFT JOIN
- 它会将条件从 booked
反转为 not booked
。
SELECT p.id, p.title
FROM properties p
LEFT JOIN bookings b ON p.id = b.property_id
AND b.booked_from_date <= 'selected_to_date'
AND b.booked_to_date >= 'selected_from_date'
WHERE b.id IS NULL