@ilyasovd
Ruby / Ruby on Rails разработчик

Как сделать эффективный запрос по диапазону дат?

Привет всем! Назревает проблема, необходимо сделать возможность фильтрации по диапазону дат с полным совпадением по датам. Грубо говоря есть сервис бронирования гостиниц, пользователь задает от 1 апреля по 10 апреля, в то же время владелец гостиницы заранее задал в какие даты у него доступно бронирование номера. Необходимо отфильтровать номера по полному совпадению дат. Даты решено было хранить в отдельной таблице со столбцом date, в котором хранится конкретный день.
Не приходит хорошей мысли как эффективнее сделать запрос что бы не нужно было перебирать по каждому дню. Мне кажется это будет занимать очень много времени при большом количестве номеров. Или кроме этого решения больше нет выхода? Спасибо за внимание!
  • Вопрос задан
  • 1220 просмотров
Пригласить эксперта
Ответы на вопрос 4
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Так вроде бы проблем нет.
Отельер в таблице указывает даты, когда номер может быть забронирован.
типа
outdate                  indate                room
20-01-2015           22-01-2015            125

Делаем просто в два этапа.
1) выбираем все номера за свободный промежуток
select * from freerooms where outdate between 20-01-2015 and 23-01-2015 and indate between 20-01-2015 and 23-01-2015

2) Получив список (он будет небольшим, даже для гостиницы в 10000 номеров), программно проходим по массиву номеров и дополнительно подыскиваем по требуемому времени.
Это все конечно приблизительно, но испытать можно за 20 минут.
Ответ написан
@aol-nnov
а вот интервалы есть в постгресе. можно подумать в эту сторону..
Ответ написан
Комментировать
@0LLEGator
"Начинающий" программист в средней компании.
Из таблицы со свободными датами номеров выбираете все записи, у которых дата попадает в введённый пользователем диапазон и проверяем, что количество записей для каждого номера равно диапазону.
Таблица FreeNumbers:
FreeDate - Дата, когда номер свободен
NumberNo - номер номера

SELECT count(NumberNo), datediff ('dd', @BeginDate, @EndDate), NumberNo
From FreeNumbers
WHERE FreeDate between @BeginDate and @EndDate
group by NumberNo, datediff ('dd', @BeginDate, @EndDate)

Код на MS SQL'е, звиняйте.
Спасибо, nApoBo3, за ценное замечание
Ответ написан
@nApoBo3
Вы отталкиваетесь от одной гостиницы или это агрегатор.
Если от одной, то проблемы имхо вообще нет, даже если сделать всё очень плохо.
Допустим в гостинице 400 номеров, в году 365 дней, в таблице в храним Id номера, дату, статус номера. Это примерно 8 байт на запись( для postgresql), около мегабайта в год.
Данные прошлых периодов можно сразу переносить в архив.
Запрос: даты где номер не среди номеров для которых есть занято в датах с, по.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы