0

我有一个脚本可以检查在用户请求的时间内是否已经安排了会话。如果在该时间范围内有另一个会话,我需要确保用户无法安排会话。这是我所做的:

//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 之类的内容,它将通过测试。

我需要代码来确保用户输入的时间范围与已安排的会话之间没有重叠。

4

3 回答 3

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) {

}
于 2013-02-13T20:07:39.317 回答
0
"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 分钟休息时间),那么它们会重叠。

尔格:如果 COUNT(*) 不为零,则某些内容重叠。当然,如果你关心的话,你也可以查询重叠的会话的实际数据。

于 2013-02-13T20:24:19.517 回答
0

这个问题也可以使用一个简单的查询来解决,该查询返回重叠会话的 id 列表。虽然我在查询(@S/@E)中使用了变量,但它们可以并且可能应该替换为实际值。另请注意,您需要从开始时间 (@S) 中减去这 15 分钟,然后在结束时间 (@E) 中加上 15 分钟。

架构:

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');

询问:

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/#!2/5d958e/6/2

于 2013-02-13T21:12:22.420 回答