11

データベースから読み取った時間が、ユーザーから提供された時間と重複しているかどうかを確認したい。

私のデータベースは次のようになります。

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

意図的に重複する 2 つの時間を入力すると、エラーは表示されません。私は何を間違っていますか?

4

6 に答える 6

33

2 つの期間 P1 と P2 が重複するのは、次の条件の少なくとも 1 つが成り立つ場合だけです。

  1. P1 は P2 の開始と終了の間に開始します ( P2.from <= P1.from <= P2.to)
  2. P2 は、P1 の開始と終了の間に開始されます ( P1.from <= P2.from <= P1.to)

これにより、部分的に重複する期間や、一方が他方を完全に覆う期間が検出されます。期間が重複している場合、一方の期間は常に他方の期間内で開始 (または終了) する必要があります。

したがって$another_meeting、次のように定義されます。

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

<あるイベントが別のイベントの終了と同時に開始できる場合は、境界ケースを厳密なチェックに変更することをお勧めします。

于 2012-06-19T10:21:08.097 に答える
4

ちょうど似たようなことをしていました....しかし、ちょうど時間で....

$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";
}
于 2012-06-19T10:08:49.920 に答える
2

私はおそらく次のようなものでそれを解決するでしょう:

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;
}
于 2012-06-19T10:44:40.083 に答える