在数据库内查询之间

时间:2016-12-13 03:34:05

标签: sql database ms-access-2016

我一直试图解决这个问题多年,但仍然没有运气。

我正在尝试建立一个车辆数据库,在那里我检查车辆在我输入的日期的可用性,人们可以将它们出租。例如,他们想要从2016年11月5日至2016年11月20日租用车辆。

我已经能够将查询连接回车辆表,但是当我测试查询时,它或者给我列出所有可用的车辆或者没有列出。

我已经包含了表和关系,因为我认为每个表之间的表可能会导致我的问题。

非常感谢任何修复此代码的建议。

Relationships Tables

SELECT *
FROM Vehicles
WHERE Vehicles.vehicle_id NOT IN 
        (
        SELECT distinct Booking.[vehicle id]
        FROM Booking
     WHERE (
    [Enter Start Date] BETWEEN booking.start_rent_date
        AND booking.end_rent_date
    )
OR (
    [Enter End Date] BETWEEN booking.start_rent_date
        AND booking.end_rent_date
    )
 );

2 个答案:

答案 0 :(得分:0)

我认为这是left join

select v.*
from vehicles v left join
     bookings b
     on v.vehicle_id = b.vehicle_id and
        b.start_rent_date <= @EnterEndDate and
        b.end_rent_date >= @EnterStartDate
where b.vehicle_id is null;

如果租车在所需的结束日期之前开始并且在所需的开始日期之后结束,则车辆不是免费的。 left join排除了这些。您也可以使用NOT EXISTSNOT IN作为等效逻辑。

编辑:

哦,您正在使用MS Access。 。

select v.*
from vehicles as v left join
     (select b.*
      from bookings as b
      where b.start_rent_date <= @EnterEndDate and
            b.end_rent_date >= @EnterStartDate
     ) as b
     on v.vehicle_id = b.vehicle_id
where b.vehicle_id is null;

答案 1 :(得分:0)

SELECT  *
FROM    Vehicles
WHERE   Vehicles.vehicle_id NOT IN (
                                    SELECT distinct D1.[vehicle id]
                                    FROM Booking D1
                                    WHERE ( DATEDIFF(DAY, D1.start_rent_date, @Enter_Start_Date)>=0
                                            And DATEDIFF(DAY, D1.end_rent_date, @Enter_Start_Date)<=0
                                            )
                                            OR 
                                            (
                                            DATEDIFF(DAY, D1.start_rent_date, @Enter_End_Date)>=0
                                            And DATEDIFF(DAY, D1.end_rent_date, @Enter_End_Date)<=0
                                            )
                                            OR 
                                            (
                                            DATEDIFF(DAY, D1.start_rent_date, @Enter_Start_Date)<=0
                                            And DATEDIFF(DAY, D1.end_rent_date, @Enter_End_Date)>=0
                                            )
                                    );