Вот моя таблица таблиц DiscountPeriod
:
id
room_id
date_from
date_last
discount
Представьте, что у нас есть скидка начиная с 01 December 2017
и заканчивается 10 December 2017
.
Я ищу диапазон дат, чтобы узнать, есть ли у него скидка. Таким образом, диапазон дат может быть полностью или частично внутри некоторых периодов дисконтирования. 3 примерные диапазоны дат для поиска:
Ожидается, что для всех трех приведенных выше примеров необходимо получить скидку, которая начинается с 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 декабря.
Это похоже на проблему перекрытия диапазона. Если вы хотите вернуть все скидки, которые перекрываются с 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 года, отсутствует, как и следовало ожидать.
<
и>
должно быть<=
и>=
.