MySQL / PHP Query - убедитесь, что введенные даты начала / окончания не перекрывают существующие диапазоны дат в БД - PullRequest
2 голосов
/ 20 сентября 2011

Я думаю, что это должно быть проще, чем моя голова лечит - но я слишком долго на это смотрел ...

У меня есть база данных соревнований для клиента. Они могут войти в систему и загрузить фотографию приза, вопрос, даты начала / окончания и т. Д.

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

Моя голова сумела достать меня так далеко:

$db->query('SELECT
    1 
FROM
    ' . DB_T_PREFIX . 'competition
WHERE
    (
        start_date <= "'.$fldStartDate->getValue().'"
    AND
        close_date >= "'.$fldStartDate->getValue().'"
    )
AND
    deleted = "0000-00-00 00:00:00"');

Может ли кто-нибудь здравомыслящий проверить меня, чтобы это перекрывало любые совпадения? Я почти уверен, что мне нужно больше условий, чтобы покрыть это, но голова превратилась в месиво ... ненавижу работать с диапазонами дат.

Спасибо

Steve

Ответы [ 2 ]

0 голосов
/ 09 июня 2016

Однажды я написал приложение для планирования, которое сделало что-то подобное.Я использовал следующий запрос:

$query = "SELECT ... WHERE ((a.start_time < '$start' AND a.end_time > '$start') OR (a.start_time > '$start' AND a.end_time < '$end')) AND i.user_id=$userId";

$start - время начала нового события, $end - время окончания нового события.Также убедитесь, что $start и $end отформатированы как 'Y-m-d H:i:s'

0 голосов
/ 20 сентября 2011

Рисование вещей, связанных со временем, часто полезно:

Timeline ( |------| is one competition; |.......| is "free" time)

Schedule:
...|-----------|.........|-------------------|......|--------|....>
         X                         Y                    Z
You want to create a new Competition:
...................|-------------|................................>
                         NEW

Как вы видите, этот период пересекается с соревнованием Y.Чтобы найти каждое пересекающееся соревнование, проверьте это в БД (псевдокод):

SELECT 1 FROM x WHERE
  start_date < new_start_date AND end_date > new start_date //intersect left
  OR
  start_date < new_end_date   AND end_date > new_end_date //intersect right
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...