0

所以我有点卡在我需要做的这个查询上,我不知道它甚至意味着什么。

我需要能够从名为 Vehicle_Details 的表中找到车辆编号,并检查它当前是否在我想使用它的时间段内使用,如下所述。

当安排新行程时,管理员必须找到在行程期间尚未使用的车辆。由于此查询将经常需要,因此可以轻松地针对任意开始和结束日期运行它很重要。因此,它应该使用替换变量,以便可以在运行时提供行程开始和结束日期。

确保在运行时只提示用户提供一次开始和结束日期。还要确保显示的任何车辆在指定的整个期间都可用 - 您必须在 where 子句中包含多个测试

任何代码都会有所帮助,但甚至可以链接到可以帮助我自己编写代码的东西,因为我不知道。

Example data from the three tables:
Trip_ID     Departure       Return_Date    Duration Registration
73180   07-FEB-12   08-FEB-12   1   PY09 XRH
73181   07-FEB-12   08-FEB-12   1   PY10 OPM
73182   07-FEB-12   10-FEB-12   3   PY56 BZT
73183   07-FEB-12   08-FEB-12   1   PY56 BZU
73184   07-FEB-12   09-FEB-12   2   PY58 UHF

Registration   Make          Model           Year
4585 AW        ALBION        RIEVER          1963
SDU 567M       ATKINSON      N/A             1974
P525 CAO       DAF           FT85.400        1996
PY55 CGO       DAF           FTGCF85.430     2005
PY06 BYP       DAF           FTGCF85.430     2006

Weight  Registration Body   Vehicle ID
20321   4585 AW     N/A      1
32520   SDU 567M    N/A      2
40000   P525 CAO    N/A      3
40000   PY55 CGO    N/A      4
40000   PY06 BYP    N/A      5
4

1 回答 1

1

您需要查找特定日期范围是否与任何预订相交。这是区间相交算法。考虑以下区间[A,B][x,y]

-----------[xxxxxxxxxxx]-------------
           A           B

---------------------[xxxxxx]--------
                     x      y

当且[x,y][A,B]当:

  1. B >= x
  2. A <= y

因此,您的查询将如下所示:

SELECT * 
  FROM registrations reg
 WHERE reg.registration = :searched_vehicle
   AND NOT EXISTS (SELECT NULL
                     FROM reservations res
                    WHERE res.registration = reg.registration
                      AND res.return_date >= :interval_start 
                      AND res.departure <= :interval_end)

这是针对一辆车的。如果查询返回一行,则该车辆在给定的时间间隔内可用[:interval_start, :interval_end]

于 2012-11-12T12:23:44.340 回答