Проверьте, перекрывается ли два раза

Я хочу, чтобы время, которое я прочитал из db, накладывается на время, предоставленное пользователем.

Моя база данных выглядит так:

----------------------------------------------- |organiser|meeting_start|meeting_end|boardroom| ----------------------------------------------- | John Doe| 1340193600 | 1340195400| big | ----------------------------------------------- 

Мой код выглядит так:

 date_default_timezone_set('Africa/Johannesburg'); $from = strtotime($_GET['meeting_date'] . ' ' . $_GET['meeting_start']); $to = strtotime($_GET['meeting_date'] . ' ' . $_GET['meeting_end']); $another_meeting = false; $meeting_date = strtotime($_GET['meeting_date']); $meeting_next = $meeting_date + 86400; $result = mysql_query("SELECT meeting_start, meeting_end FROM admin_boardroom_booking WHERE boardroom = '" . $_GET['boardroom'] . "' AND meeting_start >= '" . $meeting_date . "' AND meeting_end < '" . $meeting_next . "'")or die(mysql_error()); while($row = mysql_fetch_array($result)) { $from_compare = $row['meeting_start']; $to_compare = $row['meeting_end']; $intersect = min($to, $to_compare) - max($from, $from_compare); if ( $intersect < 0 ) $intersect = 0; $overlap = $intersect / 3600; if ( $overlap <= 0 ) { $another_meeting = true; break; } } if ($another_meeting) echo 'ERROR'; 

Если я намереваюсь ввести два перекрывающих друг друга времени, это не приведет к ошибке. Что я делаю не так?

Related of "Проверьте, перекрывается ли два раза"

Два периода времени P1 и P2 перекрываются, если и только если выполняется хотя бы одно из этих условий:

  1. P1 начинается между началом и концом P2 ( P2.from <= P1.from <= P2.to )
  2. P2 начинается между началом и концом P1 ( P1.from <= P2.from <= P1.to )

Это будет охватывать частично перекрывающиеся периоды, а также периоды, когда один полностью покрывает другой. Один из периодов всегда должен начинаться (или заканчиваться) внутри другого, если они перекрываются.

Таким образом, $another_meeting будет определяться:

 $another_meeting = ($from >= $from_compare && $from <= $to_compare) || ($from_compare >= $from && $from_compare <= $to); 

Вы можете изменить граничные случаи на строгие < проверки, может ли одно событие начинаться в то же время, что и другое.

Просто делал что-то подобное …. но только раз …

 $startTime = strtotime("7:00"); $endTime = strtotime("10:30"); $chkStartTime = strtotime("10:00"); $chkEndTime = strtotime("12:10"); if($chkStartTime > $startTime && $chkEndTime < $endTime) { // Check time is in between start and end time echo "1 Time is in between start and end time"; } elseif(($chkStartTime > $startTime && $chkStartTime < $endTime) || ($chkEndTime > $startTime && $chkEndTime < $endTime)) { // Check start or end time is in between start and end time echo "2 ChK start or end Time is in between start and end time"; } elseif($chkStartTime==$startTime || $chkEndTime==$endTime) { // Check start or end time is at the border of start and end time echo "3 ChK start or end Time is at the border of start and end time"; } elseif($startTime > $chkStartTime && $endTime < $chkEndTime) { // start and end time is in between the check start and end time. echo "4 start and end Time is overlapping chk start and end time"; } 

Я бы, вероятно, решил это с чем-то вроде этого:

 function avaliable($start, $end) { // checks if there's a meeting between start or end $q = "SELECT * FROM admin_boardroom_booking " . "WHERE NOT (meeting_start BETWEEN '$end' AND '$start' " . "OR meeting_end BETWEEN '$end' AND '$start')"; $result = mysql_query($q); // returns true on no conflicts and false elseway return mysql_num_rows($result) === 0; } 

Ответ Эмиля Викстрема правильный, но есть сценарий, который необходимо рассмотреть.
Например, один из временных диапазонов – это подмножество другого временного диапазона.
Итак, предположим, что P1{start_time, end_time} и P2{start_time, end_time} будут перекрываться, если выполнено одно из следующих утверждений.

  • P1.start_time <= P2.start_time <= P1.end_time
  • P1.start_time <= P2.end_time <= P1.end_time
  • P2.start_time <= P1.start_time <= P1.end_time <= P2.end_time

Предполагая, что время сортируется в порядке возрастания. Пример:

 |-----------------------------------| | Start time | End time | Name | |-----------------------------------| | 10:00 | 14:00 | P1 | |-----------------------------------| | 12:00 | 16:00 | P2 | |-----------------------------------| | 08:00 | 12:00 | P3 | |-----------------------------------| | 07:00 | 16:00 | P4 | |-----------------------------------| 

Если вы считаете P1 базовым временем, и вы хотите проверить P2, P3, P4 на это.

  1. P1.start_time <= P2.start_time <= P1.end_time true
  2. P1.start_time <= P3.end_time <= P1.end_time true
  3. P4.start_time <= P1.start_time <= P1.end_time <= P4.end_time true

Вот как вы можете проверить, перекрывает ли какое-либо время другое или нет.