MySQL: поиск строк с конфликтующими диапазонами дат - PullRequest
2 голосов
/ 26 апреля 2010

Я пишу систему бронирования рекламы для нашего сайта. Объявления регистрируются с полями 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

1 Ответ

6 голосов
/ 26 апреля 2010
SELECT *
  FROM adverts
 WHERE `EndDate` >= :AdStartDate
   AND `StartDate` <= :AdEndDate

Я не учел крайний случай, когда даты начала и окончания равны, так как я не знаю, каковы ваши правила для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...