oracle和用户输入

时间:2012-11-12 09:32:43

标签: database oracle

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

我需要能够从名为Vehicle_Details的表格中找到一个车辆编号,并检查它是否在当前正在使用的时间段我想用它来表示。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

当且仅当:

时,时间间隔[x,y]将与[A,B]相交
  1. B >= x
  2. A <= y
  3. 所以你的查询看起来像:

    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]内可用。