Как убедиться, что не существует перекрытия между диапазонами меток времени UNIX
У меня есть скрипт, который проверяет, запланирован ли уже сеанс в течение времени, запрошенного пользователем. Мне нужно убедиться, что пользователь не может запланировать сеанс, если в этот период есть другой сеанс. Вот что я сделал:
//Check to make sure no sessions have been already scheduled for this time
$session_check_query = "SELECT * FROM requested_sessions WHERE username_t = '{$tutor_usernname}'";
$session_check_process = mysql_query($session_check_query);
while ($session_check = mysql_fetch_array($session_check_process)) {
if ($session_check['time_from'] - $session_to_time <= 900 && $session_check['time_from'] > $session_to_time && $session_check['accepted'] == 1) {
header("Location:../../../iframes/schedule-session.php?".$url_string."&error=notavail");
exit;
}
if ($session_check['time_from'] <= $session_from_time && $session_check['time_to'] >= $session_to_time && $session_check['accepted'] == 1) {
header("Location:../../../iframes/schedule-session.php?".$url_string."&error=notavail");
exit;
}
}
Этот первый оператор "if" обеспечивает отсутствие предстоящего сеанса в течение следующих 15 минут, а второй оператор "if" гарантирует, что введенное время не попадает в диапазон запланированного сеанса.
Однако предположим, что сессия запланирована с 11:00 до 12:00. Этот код будет работать нормально, если я введу, скажем, с 11:15 до 11:30, но если я введу что-то вроде с 11:30 до 12:15 или с 10:45 до 12:15, он пройдет тест.
Мне нужен код, чтобы убедиться, что нет никакого перекрытия между временным диапазоном, введенным пользователем, и сессиями, которые уже были запланированы.
3 ответа
Вам нужно знать, заканчивается ли выбранное время после начала сеанса и начинается ли до конца сеанса.
// You obviously need to set these appropriately or change the code below for your needs
$userSelectedStart = 1;
$userSelectedEnd = 2;
$knownStart = 3;
$knownEnd = 4;
if ($userSelectedStart <= $knownEnd && $userSelectedEnd >= $knownStart) {
}
Проблема также может быть решена с помощью тривиального запроса, который возвращает список идентификаторов для перекрывающихся сеансов. Хотя я использовал переменные в запросе (@S/@E), они могут и, вероятно, должны быть заменены фактическими значениями. Также обратите внимание, что вам нужно вычесть эти 15 минут из времени начала (@S) и добавить 15 минут к времени окончания (@E).
SCHEMA:
CREATE TABLE SESSION (
ID BIGINT NOT NULL PRIMARY KEY,
USER_ID VARCHAR(30) NOT NULL,
START DATETIME NOT NULL,
END DATETIME NOT NULL
);
INSERT INTO SESSION VALUES (1, 'test', '2013-02-10 14:00:00', '2013-02-10 14:30:00');
INSERT INTO SESSION VALUES (2, 'test', '2013-02-10 12:00:00', '2013-02-10 13:30:00');
INSERT INTO SESSION VALUES (3, 'test', '2013-02-10 16:00:00', '2013-02-10 21:30:00');
INSERT INTO SESSION VALUES (4, 'test', '2013-02-10 8:00:00', '2013-02-10 11:30:00');
QUERY:
SET @S = '2013-02-10 14:40:00';
SET @E = '2013-02-10 16:00:00';
SELECT ID FROM SESSION
WHERE START <= @S AND END > @S
OR START > @S AND START <= @E;
А вот ссылка SQL Fiddle: http://sqlfiddle.com/
"SELECT COUNT(*) FROM requested_sessions WHERE username_t = '{$tutor_usernname}'
AND
(time_to > ".($session_from_time - 900)." OR time_from < ".($session_to_time + 900).")";
Если время окончания сеанса больше, чем время начала нового сеанса (минус требуемый 15-минутный перерыв), они перекрываются.
Если время начала сеанса меньше, чем время окончания нового сеанса (опять же, плюс ваш 15-минутный перерыв), то они перекрываются.
Ergo: Если COUNT(*) не равно нулю, что-то перекрывается. Конечно, вы также можете запросить фактические данные сессий, которые перекрываются, если вы заботитесь об этом.