SQL 查询根据预订日期获得免费车辆

SQL query to get free vehicles on basis of their booking date

这是我的库存 Table,

这是我的参与库存日志 Table,

还有一个主预订 Table,其中包含包含特定预订详细信息的不同字段。

一旦在 Main Booking Table 中创建了一行,插入触发器就会插入到 EngagedInventoryLog Table 中,并带有各自的 PickupDateDropDate以及从主预订中预订的车辆的 RegistrationNo Table。

现在,如果我要使用 PickupDate = 15/09/2019 进行预订 10:00:00 和 DropDate = 16/09/2019 16:00:00 那么只有那些免费或未预订的车辆应该可用,换句话说,不与 EngagedInventoryLogPickupDate 和 [= 中的记录冲突14=] 列。 (即 RegisNo 2345)

类似情况:10/09/2019 10:00:00 至 13/09/2019 10:00:00 我们必须获得两辆车的 RegisNo,即 1234 、 2345

如果是 10/09/2019 10:00:00 到 17/09/2019 10:00:00 那里不应有车辆。

这是我试过但在某些情况下不起作用的查询,

SELECT DISTINCT Id, VehicleName + '#' + ISNULL(RegisNo, '') AS 'Model'
FROM            Inventory
WHERE SupplierName = 'John'
AND
RegisNo NOT IN (
SELECT RegisNo FROM EngagedInventoryLog
WHERE
CONVERT(DATETIME,'15/09/2019 10:00:00',103) <  DropDate
    AND convert(DATETIME,'16/09/2019 16:00:00',103) > PickupDate

)

我将使用具有 NOT EXITS 条件的相关子查询来拉出与目标范围重叠的不存在交战的车辆:

SELECT *
FROM Inventory i
WHERE 
    SupplierName = 'John'
    AND NOT EXISTS (
        SELECT 1
        FROM EngagedInventory e
        WHERE 
            e.RegisNo = i.RegisNo
            AND @PickupDate <= e.DropDate 
            AND @DropDate >= e.PickupDate
    )

您可以将 @PickupDate@DropDate 替换为您要为其创建新参与的日期范围。

在此 demo on DB Fiddle 中使用您的示例数据,当给定取件日期 '2019-09-15 10:00:00' 和送达日期 '2019-09-16 10:00:00' 时,查询 returns:

id | SupplierName | VehiculeName | RegisNo
-: | :----------- | :----------- | ------:
 2 | John         | Creta        |    2345