versiones guia espaƱol descargar actualizar php mysql time overlapping

php - guia - Compruebe si se superponen dos veces



qgis manual (4)

Dos períodos de tiempo P1 y P2 se solapan si, y solo si, al menos una de estas condiciones se cumple:

  1. P1 comienza entre el inicio y el final de P2 ( P2.from <= P1.from <= P2.to )
  2. P2 comienza entre el inicio y el final de P1 ( P1.from <= P2.from <= P1.to )

Esto atrapará períodos parcialmente superpuestos, así como períodos en los que uno cubre completamente al otro. Uno de los períodos siempre debe comenzar (o finalizar) dentro del otro si se superponen.

Entonces $another_meeting se definiría por:

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

Es posible que desee cambiar los casos límite a estricto < comprueba si un evento puede comenzar exactamente al mismo tiempo que otro finaliza.

Quiero ver si una hora que leo desde un archivo db se superpone con un tiempo proporcionado por un usuario.

Mi base de datos se ve así:

----------------------------------------------- |organiser|meeting_start|meeting_end|boardroom| ----------------------------------------------- | John Doe| 1340193600 | 1340195400| big | -----------------------------------------------

Mi código se ve así:

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

Si escribo dos veces superpuestas a propósito, no se repite el error. ¿Qué estoy haciendo mal?


Estaba haciendo algo similar ... pero solo con los tiempos ...

$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"; }


Probablemente lo resolvería con algo como esto:

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


La respuesta de Emil Vikström es correcta, pero hay que considerar un escenario.
Como, uno de los rangos de tiempo es un subconjunto de otro rango de tiempo.
Por lo tanto, supongamos que P1{start_time, end_time} y P2{start_time, end_time} se superpondrán cuando cualquiera de los siguientes sea verdadero.

  • P1.start_time <= P2.start_time <= P1.end_time
  • P1.start_time <= P2.end_time <= P1.end_time
  • P2.start_time <= P1.start_time <= P1.end_time <= P2.end_time

Solo suponiendo que los tiempos estén ordenados en orden ascendente. Ejemplo a continuación:

|-----------------------------------| | Start time | End time | Name | |-----------------------------------| | 10:00 | 14:00 | P1 | |-----------------------------------| | 12:00 | 16:00 | P2 | |-----------------------------------| | 08:00 | 12:00 | P3 | |-----------------------------------| | 07:00 | 16:00 | P4 | |-----------------------------------|

Si considera P1 como la hora base y desea verificar P2, P3, P4 contra ella.

  1. P1.start_time <= P2.start_time <= P1.end_time true
  2. P1.start_time <= P3.end_time <= P1.end_time true
  3. P4.start_time <= P1.start_time <= P1.end_time <= P4.end_time true

Así es como puede verificar si alguna parte del tiempo se superpone a otra o no.