MySQL перекрывает даты, не конфликтует

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

У меня есть таблица MySQL с 3 столбцами, date – 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, и я исхожу из того, что запрос может быть запущен, и если есть «соответствующие результаты», то не удастся, если есть «arent» соответствующие результаты, затем вставьте.

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

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

Ну, попробуй. Здесь :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` 

Я столкнулся с этой проблемой обнаружения перекрытия даты, моя первая идея заключалась в том, чтобы сделать что-то вроде решения 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 ) 

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

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

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

Предполагая, что $ 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` )'; 

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

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

 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 до 11:00 - 13:00 .