Вам не нужна такая сложная модель. Все, что вам нужно, - это таблица, в которой указаны блоки времени, для которых арендные единицы не доступны, иными словами, таблица с забронированным временем для каждой арендуемой единицы. Например:
create table BOOKING
( rental_unit_id int
, start_datetime date
, end_datetime date
)
Теперь, если вы хотите получить список арендуемых единиц, которые доступны для всего заданного временного блока, скажите @Arrive на @Depart, тогда все, что вам нужно сделать, это выполнить запрос, подобный этому:
select R.rental_unit_id -- (and anything else you want)
from RENTAL_UNIT R
where not exists ( select B.rental_unit_id
from BOOKING B
where B.rental_unit_id = R.rental_unit_id
and end_datetime > @Arrive
and start_datetime < @Depart )
В этом запросе говорится, что мне нужно получить список единиц аренды, где нет бронирования, которое перекрывает интересующий период поиска (от @Arrive до @Depart). Обратите внимание, что вы можете играть с <= @Depart в зависимости от того, хотите ли вы иметь инклюзивную или эксклюзивную конечную точку для ваших периодов бронирования. </p>
РЕДАКТИРОВАТЬ: Обработка нескольких блоков доступности
@ OP добавлено требование для нескольких блоков доступности. Если вы арендуете оборудование на несколько дней, то @Arrive и @Depart просто происходят в разные дни. Если, как в примере с @ OP, в нескольких днях есть промежутки в середине - предположительно, когда оборудование возвращено и может быть сдано в аренду кому-то другому - тогда вам просто нужно добавить дополнительные пункты where not exists
- по одному для каждого независимого блока желаемого доступность. Просто «и» их вместе, и вы найдете арендные единицы, которые доступны во всех желаемых временных блоков. Понятие лучших или худших матчей на самом деле не применимо. Арендная единица либо доступна, либо ее нет.