使用 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 对于 true0 对于 false.

如果 ID 为 '1009' 的车辆在 table 中存在状态为 'Pending''Confirmed'FromDate 之前(或等于) 到传递的 下车 日期 ToDate 之后(或等于)传递的 取车日期,这意味着车辆已预订,EXISTS 将 return 1 最后 NOT EXISTS 将 return 0,这将是车辆的可用性。

在这里,重要的是比较 FromDate:to_date 以及 ToDate:from_date 而不是相反,这样日期间隔的所有情况都覆盖了。

参见demo