Я пишу систему бронирования рекламы для нашего сайта. Объявления регистрируются с полями StartDate
и EndDate
, чтобы указать, как долго они в сети.
При добавлении нового объявления у меня есть быстрая проверка, чтобы убедиться, что новое объявление не конфликтует с существующим объявлением, которое заняло ту же позицию.
Я думал, что у меня есть этот запрос:
SELECT *
FROM adverts
WHERE EndDate >= '2010-04-22'
AND StartDate < '2010-04-22'
2010-4-22 - это StartDate
для нового объявления, которое я хочу забронировать. Уже зарегистрировано объявление, в котором StartDate
- 2010-04-26, а EndDate
- 2010-05-09.
Это результаты запроса с разными датами:
попытаться забронировать объявление, начинающееся после того, как закончится существующее объявление: возвращает 0 строк (правильно)
попытаться забронировать объявление, начинающееся и заканчивающееся В ТЕЧЕНИЕ диапазона дат существующего объявления: возвращает 1 строку (правильно)
попытаться забронировать объявление, начинающееся и заканчивающееся ДО начала существующего объявления: возвращает 0 строк
(Исправить)
попытаться забронировать объявление, начинающееся ДО начала существующего объявления, и продолжающее в течение диапазона дат существующего объявления: возвращает 0 строк (неверно)
попытаться забронировать объявление, начинающееся ДО и заканчивающееся ПОСЛЕ окончания текущего объявления: возвращает 0 строк (неверно!)
У кого-нибудь есть идеи, как переписать этот запрос, чтобы я мог убедиться, что он обнаруживает только коллизии в диапазонах дат?
Спасибо,
Matt