Я видел много потоков о диапазонах дат в 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
.