Находите область дат из MySQL эффективно

0

Вот моя таблица таблиц DiscountPeriod:

id
room_id
date_from
date_last
discount

Представьте, что у нас есть скидка начиная с 01 December 2017 и заканчивается 10 December 2017.

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

  • С 02 декабря по 10 декабря (полностью внутри одного из дисконтных периодов)
  • С 20 ноября по 4 декабря (частично внутри)
  • С 5 декабря по 15 декабря (частично внутри)

Ожидается, что для всех трех приведенных выше примеров необходимо получить скидку, которая начинается с 01 December 2017 и заканчивается 10 December 2017.

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

Это выглядит так:

SELECT * FROM 'DiscountPeriod' WHERE ('room_id'=1517) AND ('date_last' >= '2017-12-12') AND ('date_from' <= '2017-12-20');

Вопрос в том, как поместить все 3 возможных случая поиска в 1 запрос для эффективного поиска в таблицах базы данных MySQL?

Ожидаемый результат

Все следующие области: с 02 декабря по 10 декабря, с 20 ноября по 4 декабря, с 5 декабря по 15 декабря следует вернуть скидку 1-10 декабря.

Теги:
database
select
date

1 ответ

1

Это похоже на проблему перекрытия диапазона. Если вы хотите вернуть все скидки, которые перекрываются с 1-10 декабря 2017 года, попробуйте выполнить следующий запрос:

SELECT *
FROM DiscountPeriod
WHERE
    room_id = 1517 AND
    '2017-12-01' <= date_last AND '2017-12-10' >= date_from;

Вот демоверсия, в которой используются ваши тестовые данные. Все три диапазона скидок, которые вы предложили, отображаются в результирующем наборе. Но диапазон, лежащий полностью вне 1-10 декабря 2017 года, отсутствует, как и следовало ожидать.

демонстрация

  • 0
    Все следующие области действия: с 02 декабря по 10 декабря, с 20 ноября по 4 декабря, с 5 декабря по 15 декабря должна быть возвращена скидка 1-10 декабря. Ваш запрос работает для всех 3?
  • 0
    Я думаю, < и > должно быть <= и >= .
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню