Проверяйте наличие даты с помощью одного SQL выписки (с перекрытием и между ними) - PullRequest
1 голос
/ 05 мая 2020

У меня два стола: номер и наличие. В наличии есть несколько заблокированных дат для каждой комнаты.

Я просто хочу показать доступные комнаты в заданном диапазоне. Моя инструкция SQL выглядит так:

SELECT id, name
FROM rooms
WHERE av_id NOT IN (
SELECT av_id 
FROM availability 
WHERE (? BETWEEN datetime_start AND datetime_end
    OR ? BETWEEN datetime_start AND datetime_end)
)

? и ? - заданная дата для начала и в моем подготовленном операторе.

Проблема: это улавливает только случай, если начало или конец находятся между датами, а не перекрываются. Я уже час читаю другие посты, но не понял правильного логического подхода. Думаю, мне нужно добавить еще один пункт с> и <, но не знаю, как именно. </p>

Спасибо за любые подсказки для новичка!

1 Ответ

1 голос
/ 05 мая 2020

Используйте not exists. . . и сравнение logi c, чтобы получить какое-либо перекрытие. Я думаю, что это:

SELECT id, name
FROM rooms r
WHERE NOT EXISTS (SELECT 1
                  FROM availability a
                  WHERE a.av_id = r.av_id AND
                        :start_dt < a.datetime_end AND
                        :end_dt > a.dt_start
                 );

Я удивлен, что что-то под названием av_id будет использовано для связи двух таблиц. Я ожидал что-то под названием room_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...