как выбрать дату, если она уже находится между двумя значениями sql server - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь выбрать между 2 разными датами в 2 разных столбцах, и я подумал, что понял, как, пока я не достиг этой проблемы. Я думаю, что лучше привести пример:

В номере есть дата IN и OUT (связанные с отелем проблемы). Я хочу выбрать комнаты НЕ между inDate и outDate. Поэтому я мог бы использовать этот запрос:

select * from room where  inDate and outDate not between '2019-06-19' and '2019-06-26';

Давайте представим, что у нас есть комната с inDate = '2019-06-18' и outDate = '2019-06-21'.

Мой вопрос: какой правильный запрос, чтобы узнать, что пользователь не может забронировать эту комнату, потому что в это время эта комната недоступна? Потому что, если мы будем использовать ранее упомянутый запрос, эта комната будет доступна, а это явно не так.

Я видел много страниц на этой странице с просьбой о подобных вещах, но я старался не создавать дубликаты. Извините заранее, если это дубликат, и я надеюсь, что я правильно объяснил.

1 Ответ

2 голосов
/ 19 июня 2019

Если вы ищете свободные номера, то логика выглядит следующим образом:

select *
from room r
where not (inDate <= '2019-06-26' and
           outDate >= '2019-06-19'
          );

Два периода времени (например, резервирование номера и интервал) перекрываются, когда каждый начинается до того, как заканчивается другой. not означает, что вам нужны номера без бронирования.

На самом деле вышеприведенное выглядит не совсем правильно. У вас должен быть один стол для комнат и один для бронирования. Тогда запрос будет выглядеть так:

select r.*
from rooms r
where not exists (select 1
                  from reservations re
                  where re.room_id = r.room_id and
                        re.inDate <= '2019-06-26' and
                        re.outDate >= '2019-06-19'
                 );
...