MySQL перекрываются даты, ни один не конфликтует - PullRequest
2 голосов
/ 29 июня 2011

Я видел много тем о диапазонах дат в MySQL, но мне все еще не удается найти ответ на то, что я ищу, поэтому любая помощь будет получена.

У меня есть таблица MySQL с 3 столбцами, дата - startTime - finishTime.Дата - это поле типа «дата» MySQL, а время начала и окончания являются полями типа «время».

Скажем, например, у меня есть запись в базе данных следующим образом, давайте вызовем этот сеанс 1;

date = 2011-06-30, startTime = 09:00:00, finishTime = 11:00:00

Если я приду, чтобы добавить другой сеанс, мне нужно убедиться, что он не конфликтует с существующим сеансом.Таким образом, следующее не получится, потому что оно попадает между временем начала и окончания сеанса 1.

date = 2011-06-30, startTime = 10:00:00, finishTime = 12:00:00

Таким образом, запись может быть вставлена ​​только «ПОСЛЕ» или «ДО» существующего сеанса.

Я использую PHP / MySQL и собираюсь исходить из того, что запрос может быть запущен, и если есть «совпадающие» результаты, то произойдет сбой, если «нет» совпадающих результатов, затем вставьте.

Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 29 июня 2011

Я использую PHP / MySQL и собираюсь исходить из того, что запрос может быть выполнен, и если есть «совпадающие» результаты, произойдет сбой, если «нет» совпадающих результатов, вставьте.

Ну, попробуй это.Здесь :date: - это дата записи, которую вы собираетесь добавить, а :start-time: и :finish-time: - ее время начала и окончания соответственно.

SELECT EXISTS (
    SELECT
        1
    FROM
        TableName
    WHERE
        `date` = :date: AND
        ( :start-time: BETWEEN startTime AND finishTime OR
          :finish-time: BETWEEN startTime AND finishTime OR
          startTime BETWEEN :start-time: AND :finish-time:
          )
) AS `Clash`
1 голос
/ 21 февраля 2013

Я столкнулся с проблемой обнаружения перекрытия дат, моей первой идеей было сделать что-то вроде решения Hammerite, но я нашел это решение неполным, главным образом потому, что существует слишком много возможных сценариев, когда два диапазона дат могут конфликтовать:

Запрос, который я использовал для решения этой проблемы, был что-то вроде:

/* overlapping dates */
SELECT * 
FROM my_table
WHERE `date` = $date AND
  NOT (
    `start_time` < $start_time and `finish_time` < $start_time
    OR
    `start_time` > $end_time and `finish_time` > $end_time
  )

Для получения более подробной информации вы можете проверить мой блог здесь

0 голосов
/ 29 июня 2011

Я бы использовал простое:

INSERT INTO session
  ( `date`, startTime, finishTime )
  SELECT
  ( $date, $startTime, $finishTime )
  WHERE NOT EXISTS
    ( SELECT
          *
      FROM
          session
      WHERE
            `date` = $date 
        AND $startTime <  finishTime 
        AND  startTime < $finishTime 

    )

< следует изменить на <=, если вы хотите, чтобы два периода 09:00 - 11:00 и 11:00 - 13:00 столкнулись.

0 голосов
/ 29 июня 2011

Предполагая, что $ date, $ startTime и $ finishTime - это ваши PHP-переменные, в которых хранятся соответственно дата, время начала и время окончания.

$query = 'INSERT INTO `session`
SELECT \'' . $date . '\', \'' . $startTime . '\', \'' . $finishTime . '\'
FROM `session`
WHERE NOT EXISTS (SELECT *
    FROM `session`
    WHERE `date` = \'' . $date . '\'
    AND \'' . $startTime . '\' BETWEEN `startTime` and `finishTime`
)';

Надеюсь, это поможет.

0 голосов
/ 29 июня 2011

Я бы структурировал таблицу по-другому. У меня будет два столбца, оба типа datetime, с именами session_start и session_end.

Логика такова: вы не можете вставить новый сеанс, если время session_start не > или <, чем старый сеанс session_end.

...