如何确保UNIX时间戳范围之间没有重叠

时间:2013-02-13 20:03:38

标签: php unix-timestamp

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

//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 PM。如果我输入11:15到11:30,这个代码会正常工作,但是如果我输入11:30到12:15或10:45到12:15之类的东西,它将通过测试。

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

3 个答案:

答案 0 :(得分: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) {

}

答案 1 :(得分: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分钟休息时间),那么它们会重叠。

Ergo:如果COUNT(*)不为零,则会出现重叠。当然,如果您愿意,也可以查询重叠会话的实际数据。

答案 2 :(得分:0)

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

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