Нужно посмотреть, перекрывает ли диапазон дат другой диапазон дат в sql - PullRequest
3 голосов
/ 23 февраля 2011

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

ID | ROOM_ID | CHECK_IN_DATE | CHECK_OUT_DATE | USER_ID

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

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

ROOM_ID | DATE

ТАК Мне нужно выполнить запрос, который ищет свободные номерав пределах заданного диапазона, как бы я сформулировал запрос?Я использую MySQL здесь.

--- edit ---

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

ID | ROOM DETAILS etc

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

Ответы [ 3 ]

2 голосов
/ 23 февраля 2011
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'
   )

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

1 голос
/ 23 февраля 2011
SELECT id FROM rooms WHERE id NOT IN (
   SELECT room_id FROM bookings 
   WHERE check_in_date < 'end date' AND check_out_date > 'start date'
);
0 голосов
/ 23 февраля 2011

Есть как 5 возможных способов:

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

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

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

только первый и последнийэто те, которые вы хотите, так что вы ищете: search.end entry.end

...