使用 SQL 检查预订可用性
Booking availability check using SQL
我有一个 SQL table 有几条记录。
用户将提供起始日期(取车)、截止日期(还车)和车辆 ID。
理想的查询是浏览记录并检查是否预订了那些日期的特定 VehicleID。请注意,预订具有状态。如果状态为“待定”或“已确认”,则应将其视为 booked/not 可用。
另一方面,如果状态为“已取消”或在给定日期没有该 VehicleID 的记录,则应考虑 free/available 预订。
我以前在查询没有太多参数时问过这个问题,但是在添加这些参数之后我完全迷失了。
这是我的 sqlfiddle:http://sqlfiddle.com/#!9/b794c1/2/0
这里是 return 错误数据的查询:
SELECT
CASE
WHEN y.BookingID IS NOT NULL THEN '0'
ELSE '1'
END availability
FROM (SELECT 1)x
LEFT JOIN tbl_bookings y
ON FromDate <= '2021-12-22'
AND ToDate > '2021-12-15'
AND VehicleID='1009'
AND Status !='Pending'
AND Status !='Confirmed'
使用NOT EXISTS
:
SELECT NOT EXISTS (
SELECT 1
FROM tbl_bookings
WHERE VehicleId = '1009'
AND Status IN ('Pending', 'Confirmed')
AND FromDate <= :to_date AND ToDate >= :from_date
) availability
EXISTS
returns 1
对于 true
或 0
对于 false
.
如果 ID 为 '1009'
的车辆在 table 中存在状态为 'Pending'
或 'Confirmed'
且 FromDate
之前(或等于) 到传递的 下车 日期 和 ToDate
之后(或等于)传递的 取车日期,这意味着车辆已预订,EXISTS
将 return 1
最后 NOT EXISTS
将 return 0
,这将是车辆的可用性。
在这里,重要的是比较 FromDate
和 :to_date
以及 ToDate
和 :from_date
而不是相反,这样日期间隔的所有情况都覆盖了。
参见demo。
我有一个 SQL table 有几条记录。 用户将提供起始日期(取车)、截止日期(还车)和车辆 ID。
理想的查询是浏览记录并检查是否预订了那些日期的特定 VehicleID。请注意,预订具有状态。如果状态为“待定”或“已确认”,则应将其视为 booked/not 可用。 另一方面,如果状态为“已取消”或在给定日期没有该 VehicleID 的记录,则应考虑 free/available 预订。
我以前在查询没有太多参数时问过这个问题,但是在添加这些参数之后我完全迷失了。
这是我的 sqlfiddle:http://sqlfiddle.com/#!9/b794c1/2/0
这里是 return 错误数据的查询:
SELECT
CASE
WHEN y.BookingID IS NOT NULL THEN '0'
ELSE '1'
END availability
FROM (SELECT 1)x
LEFT JOIN tbl_bookings y
ON FromDate <= '2021-12-22'
AND ToDate > '2021-12-15'
AND VehicleID='1009'
AND Status !='Pending'
AND Status !='Confirmed'
使用NOT EXISTS
:
SELECT NOT EXISTS (
SELECT 1
FROM tbl_bookings
WHERE VehicleId = '1009'
AND Status IN ('Pending', 'Confirmed')
AND FromDate <= :to_date AND ToDate >= :from_date
) availability
EXISTS
returns 1
对于 true
或 0
对于 false
.
如果 ID 为 '1009'
的车辆在 table 中存在状态为 'Pending'
或 'Confirmed'
且 FromDate
之前(或等于) 到传递的 下车 日期 和 ToDate
之后(或等于)传递的 取车日期,这意味着车辆已预订,EXISTS
将 return 1
最后 NOT EXISTS
将 return 0
,这将是车辆的可用性。
在这里,重要的是比较 FromDate
和 :to_date
以及 ToDate
和 :from_date
而不是相反,这样日期间隔的所有情况都覆盖了。
参见demo。