Если я правильно понял это требование, вы ищете автомобили, которые не имеют заказов на указанный диапазон дат. Поэтому вам не следует присоединяться к таблице bookings
, потому что это даст вам автомобили с уже зарегистрированными бронированиями на другие периоды. Вы ищете автомобили, где нет бронирования, поэтому:
with cars (id, mark, description) as
( select 1, '1234 AB', 'Volvo V70' from dual union all
select 2, '4567 CD', 'VW Golf' from dual )
, bookings (id, car_id, date_from, date_to ) as
( select 1, 2, date '2018-01-01', date '2018-02-01' from dual union all
select 2, 1, date '2018-03-01', date '2018-04-01' from dual union all
select 3, 1, date '2018-05-01', date '2018-06-01' from dual union all
select 4, 2, date '2018-07-01', date '2018-08-01' from dual )
select c.*
from cars c
where not exists
( select 1 from bookings b
where b.car_id = c.id
and ( date '2018-01-13' between b.date_from and b.date_to
or date '2018-01-17' between b.date_from and b.date_to )
);
Результат:
ID MARK DESCRIPTION
---------- ------- -----------
1 1234 AB Volvo V70
Автомобиль 1 доступен, потому что он забронирован только на март и май, а Golf забронирован на январь и июль.