Я хочу, чтобы время, которое я прочитал из 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';
Если я намереваюсь ввести два перекрывающих друг друга времени, это не приведет к ошибке. Что я делаю не так?
Два периода времени P1 и P2 перекрываются, если и только если выполняется хотя бы одно из этих условий:
P2.from <= P1.from <= P2.to
) 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}
будут перекрываться, если выполнено одно из следующих утверждений.
Предполагая, что время сортируется в порядке возрастания. Пример:
|-----------------------------------| | 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 на это.
true
true
true
Вот как вы можете проверить, перекрывает ли какое-либо время другое или нет.