Php 检查两次是否重叠

Php 检查两次是否重叠,php,mysql,time,overlapping,Php,Mysql,Time,Overlapping,我想看看我从数据库读取的时间是否与用户提供的时间重叠 我的数据库如下所示: ----------------------------------------------- |organiser|meeting_start|meeting_end|boardroom| ----------------------------------------------- | John Doe| 1340193600 | 1340195400| big | --------------------

我想看看我从数据库读取的时间是否与用户提供的时间重叠

我的数据库如下所示:

-----------------------------------------------
|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';
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;
}
我的代码如下所示:

-----------------------------------------------
|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';
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;
}
date\u default\u timezone\u set('Africa/约翰内斯堡');
$from=STROTIME($获取['meeting\u date'.'。$获取['meeting\u start']);
$to=STROTIME($获取['meeting\'U date'].'。$获取['meeting\'U end']);
$Other_meeting=假;
$meeting_date=strotime($u GET['meeting_date']);
$meeting_next=$meeting_date+86400;
$result=mysql\u query(“从admin\u boardroom\u booking中选择会议开始、会议结束,其中boardroom='”、$u GET['boardroom']。”、会议开始>='、“$meeting\u date.”和会议结束<'、“$meeting\u next.”)或死亡(mysql\u error());
while($row=mysql\u fetch\u数组($result)){
$from_compare=$row['meeting_start'];
$to_compare=$row['meeting_end'];
$intersect=min($to,$to_比较)-max($from,$from_比较);
如果($intersect<0)
$intersect=0;
$overlap=$intersect/3600;

如果($overlap只是做了一些类似的事情……但只是时间

$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";
}
$startTime=strotime(“7:00”);
$endTime=strottime(“10:30”);
$chkStartTime=strotime(“10:00”);
$chkEndTime=strotime(“12:10”);
如果($chkStartTime>$startTime&$chkEndTime<$endTime)
{
//检查时间介于开始时间和结束时间之间
回显“1次在开始和结束时间之间”;
}
elseif($chkStartTime>$startTime&&chkStartTime<$endTime)| |($chkEndTime>$startTime&&chkEndTime<$endTime))
{
//检查开始或结束时间是否介于开始和结束时间之间
echo“2 ChK开始或结束时间介于开始和结束时间之间”;
}
elseif($chkStartTime==$startTime | |$chkEndTime==$endTime)
{
//检查开始或结束时间是否位于开始和结束时间的边界
echo“3 ChK开始或结束时间在开始和结束时间的边界处”;
}
elseif($startTime>$chkStartTime&$endTime<$chkEndTime)
{
//开始和结束时间介于检查开始和结束时间之间。
echo“4开始和结束时间重叠chk开始和结束时间”;
}

当且仅当以下条件中的至少一个条件成立时,P1和P2两个时间段重叠:


  • P1从P2的开始和结束之间开始(
    P2.from我可能会用这样的方法来解决它:

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

    Emil Vikström的答案是正确的,但需要考虑一种情况。
    例如,其中一个时间范围是另一个时间范围的子集。
    因此,假设
    P1{start\u time,end\u time}
    P2{start\u time,end\u time}
    在下列任一情况下重叠。


    • P1.开始时间如果$to始终晚于$from,我们可以使用更短的解决方案

      $another_meeting = !($from > $to_compare || $from_compare > $to);
      

      您的代码易受SQL注入的攻击。请阅读:并切换到参数化查询。旧的
      mysql\uuz
      函数很快就会被弃用,您应该改用MySQLi。Tanks提供帮助。但这并没有解决我的问题。@DarkRanger:您能在循环之前键入echo$result并告诉我您得到了什么吗?可能吗工作,但我还需要检查会议是否与另一个会议完全重叠。例如:会议1开始。会议2开始,会议2结束,会议1结束。查看您的代码,在这种情况下不会返回false…您的条件很不幸是错误的。如果$start在会议开始之前,$end在会议结束之后,会发生什么情况nd?括号将计算为
      false
      ,您将其反算为
      true
      !当您真的只想知道是否存在冲突时,获取所有非冲突会议也是一种非常奇怪的方法。请尝试匹配冲突会议,并使用
      COUNT(*)
      限制1
      以加快速度。看起来我有点累了,我要重写它>\uuuuu这似乎工作得很好。我对它做了一些修改,以允许完全相同的时间(我正在与工程师一起工作,指定14:01而不是14:00似乎是一个主要的大脑缺陷)。Baie Dankie(非常感谢您使用南非荷兰语)我的答案已经解决了这个问题。如果P1是P2的完整子集,那么我的第一个条件成立:P1将在P2内开始。