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

Другие вопросы по тегам