0

ユーザーが入力した開始日と終了日に基づいて、データベースから利用可能な車両を返すクエリを作成しようとしています。

これは現在、私の予約テーブル内の日付です。

Booking Table
booking_id     customer_id    reg_number    date_from    date_to    status
1              2              RH34 TJT      23-JAN-13    24-JAN-13  1
2              3              RJ54 FKF      26-JAN-13    26-JAN-13  1     

以下は私のクエリです。すでに予約テーブルにある日付と等しくない日付を入力すると機能します。たとえば、上記の表の 2 台の車に22-JAN-1327-JAN-13入力すると、それらが予約されているため、結果から除外されます。しかし、 に入れたら、この日に予約23-JAN-1324-JAN-13た車も、予約していたはずなのに返ってきてしまいます。

SELECT   *
FROM vehicles
INNER JOIN car_model ON vehicles.model_code = car_model.model_code
INNER JOIN manufacture ON car_model.manufacture_code = manufacture.manufacture_code
LEFT OUTER JOIN booking ON vehicles.reg_number = booking.reg_number
WHERE ((booking.date_from <= '23-JAN-13' OR booking.date_from >= '24-JAN-13')
        AND (booking.date_to <= '23-JAN-13' OR booking.date_to >= '24-JAN-13')
        AND booking.booking_status = 1);

私は <= と >= を使用しているため、等しい部分は等しいのでそれらを省略しますか、それとも間違っていますか?

4

2 に答える 2

0

これを試して

SELECT   *
FROM vehicles
INNER JOIN car_model ON vehicles.model_code = car_model.model_code
INNER JOIN manufacture ON car_model.manufacture_code = manufacture.manufacture_code
LEFT OUTER JOIN booking ON vehicles.reg_number = booking.reg_number
WHERE ((booking.date_from < '23-JAN-13' OR booking.date_from > '24-JAN-13')
        AND (booking.date_to < '23-JAN-13' OR booking.date_to > '24-JAN-13')
        AND booking.booking_status = 1);
于 2013-01-24T14:29:28.040 に答える
0

特定の日に予約されていない車両を探している場合は、テーブルNOT EXISTSに参加するのではなく、を使用する必要があります。VEHICLES

SELECT *
FROM   vehicles v
WHERE  NOT EXISTS (SELECT NULL
                   FROM   booking b
                   WHERE  b.reg_number = v.reg_number
                   AND    b.booking_status = 1
                   AND    ((b.date_to > to_date(:start_date,  'DD/MM/YYYY') AND b.date_from <= to_date(:start_date, 'DD/MM/YYYY')) OR 
                           (b.date_from <= to_date(:end_date, 'DD/MM/YYYY') AND b.date_to > to_date(:end_date, 'DD/MM/YYYY')) OR
                           (b.date_from <= to_date(:start_date, 'DD/MM/YYYY') AND b.date_to >= to_date(:end_date, 'DD/MM/YYYY')) OR
                           (b.date_from >= to_date(:start_date, 'DD/MM/YYYY') AND b.date_to <= to_date(:end_date, 'DD/MM/YYYY')))
于 2013-01-24T14:43:32.460 に答える