Нужно посмотреть, перекрывает ли диапазон дат другой диапазон дат в sql

У меня есть таблица, в которой хранятся заказы номеров, схема:

ID | ROOM_ID | CHECK_IN_DATE | CHECK_OUT_DATE | USER_ID

Мне нужно запустить поисковый запрос для комнат, которые доступны/недоступны между заданным диапазоном дат.

Также имейте в виду, что существует еще одна таблица, в которой хранятся даты, когда номер предварительно забронирован, и она имеет формат:

ROOM_ID | DATE

Итак, мне нужно выполнить запрос, который ищет комнаты, доступные в заданном диапазоне. Как мне сформулировать запрос? Я использую MySQL здесь.

---редактировать---

Также есть таблица Rooms схемы:

ID | ROOM DETAILS etc

Таблица недоступности / предварительно забронированных дат в основном содержит спорадические отдельные даты, каждая дата в таблице недоступности относится к дате, когда номер по какой-либо причине не может быть забронирован, например, техническое обслуживание и т. д.


person Ali    schedule 23.02.2011    source источник
comment
Смысл заранее забронированного стола неясен. Что означает поле DATE? Какой диапазон применяется?   -  person Alessandro    schedule 23.02.2011
comment
Кроме того, эта структура таблицы предполагает, что комнат не существует, если они не были предварительно забронированы или забронированы. Возможно, есть стол для номеров?   -  person eric.christensen    schedule 23.02.2011


Ответы (3)


SELECT
   ROOM_ID
FROM
   Rooms r
   LEFT JOIN Bookings b ON (
      r.ROOM_ID = b.ROOM_ID
      AND b.CHECK_IN_DATE > '$MAX_DATE'
      AND b.CHECK_OUT_DATE < '$MIN_DATE'
   )

Я не уверен, как учитываются предварительно забронированные номера, поскольку нет диапазона дат. Заранее забронированные номера также учитываются при бронировании или нет?

person Explosion Pills    schedule 23.02.2011

есть 5 возможных способов:

---s-----e---

s-e----------
--s-e--------
-----s-e-e---
--------s-e--
----------s-e

s = начало / e=конец первая строка - это набор вашей базы данных, а остальные - возможные поиски

вам нужны только первый и последний, поэтому вы ищете: search.end ‹ entry.start ИЛИ search.start > entry.end

person Flo    schedule 23.02.2011

person    schedule
comment
У вас есть ‹ и › наоборот. 2011-02-23 ‹ 2011-02-24 , но это означает, что номер недоступен, если дата отъезда приходится на 25-е число. То же самое с кассой (2011-02-23 › 2011-02-22, но народ не выписался!) - person Explosion Pills; 23.02.2011
comment
Собственно, это должно сработать. Я считаю номер недоступным, если есть хотя бы бронирование, заканчивающееся после начала желаемого периода и начинающееся до его окончания. - person Alessandro; 23.02.2011