Autoajustar fechas en MySql

Hola amigo
Estoy haciendo un sistema de reservación y de verdad que no se como hacer esto.
Tengo una tabla TBFechas que va a tener 3 campos el id, fecha_inicio, fecha_final
Quisiera que cuando el administrador inserte una fecha en la Bd si esta fecha es (mayor o igual que la fecha_inicio) y (menor o igual que la fecha_final) o sea que esta fecha se interponga entre 2 fechas entonces me autoajuste las fechas
Ejemplo
Nota las fechas las puse así para que entendieran pero están en el formato standard
id=1 fecha_incio=15 enero fecha_final=30 de enero
id=2 fecha_inicio=31 de enero fecha_final=28 de febrero
nueva fecha a insertar fecha_inicio=25 enero fecha_final=15 de febrero
como ven esta nueva fecha intersecta con las fechas del id=1 e id=2
Y el sistema debe ajustarlas para que queden
id=1 fecha_incio=15 enero fecha_final=24 de enero
id=2 fecha_inicio=16 de febrero fecha_final=28 de febrero
id=3 fecha_inicio=25 de enero fecha_final=15 de febrero (esta es la nueva que inserto)
Como ven se autoregularon 2 records
Ahora mi duda es como hacer el select y luego que tenga las fechas que están en rango autoajustarla teniendo en cuenta el mes y los días.
Por favor ayúdenme que de verdad no se como hacer esto.
Gracias por su tiempo.

2 Respuestas

Respuesta
1
Pregunta bastante complicada. Hay que tener en cuenta muchas posibilidades: que sea la primera fecha que introduces, que solo haya una fecha, que la nueva fecha solape por completo otras fechas, que esté entre dos intervalos, etc.
Te propongo el siguiente código de ejemplo. Tiene una función a la que se le pasa como parámetro un array con dos elementos (las fechas del intervalo a insertar), y un array con el resto de fechas. En este último array se guardará el resultado. También te pongo el código completo con varias fechas de prueba. Luego tendrías que adaptarlo a tu aplicación.
<?php
echo "INTERCALACIÓN DE FECHAS: <br><br>";
$fechas = array();
$fechaN = array();
$fechas[0] = mktime(0,0,0,01,15,2005); // 15-01-2005
$fechas[1] = mktime(0,0,0,01,30,2005); // 30-01-2005
$fechas[2] = mktime(0,0,0,01,31,2005); // 31-01-2005
$fechas[3] = mktime(0,0,0,02,28,2005); // 28-02-2005
$fechaN[0] = mktime(0,0,0,01,01,2005); // 01-01-05
$fechaN[1] = mktime(0,0,0,01,10,2005); // 10-01-05
// $fechaN[0] = mktime(0,0,0,01,01,2005); // 01-01-05
// $fechaN[1] = mktime(0,0,0,01,20,2005); // 20-01-05
// $fechaN[0] = mktime(0,0,0,01,18,2005); // 18-01-05
// $fechaN[1] = mktime(0,0,0,01,25,2005); // 25-01-05
// $fechaN[0] = mktime(0,0,0,01,25,2005); // 25-01-05
// $fechaN[1] = mktime(0,0,0,02,10,2005); // 10-02-05
// $fechaN[0] = mktime(0,0,0,02,25,2005); // 25-02-05
// $fechaN[1] = mktime(0,0,0,03,10,2005); // 10-03-05
InsertaFecha( $fechaN, $fechas );
echo "<br><br>";
for ($i = 0; $i < count($fechas); $i++) {
echo "[$i] -> ". date("d-m-Y", $fechas[$i]) ."   ";
}
// Requisitos:
// - fechaN[0] < fechaN[1]
// - fechas ordenado en orden ascendente y número par de elementos
// Parametros:
// - $fechaN: array con las dos fechas que forman el intervalo a insertar
// - $fechas: array en el que insertar $fechaN
// Valores devueltos:
// - $fechas: array con las fechas $fechaN insertada donde corresponda
function InsertaFecha( $fechaN, &$fechas ) {
$numFechas = count( $fechas );
$fechasA = array(); // array auxiliar
if ( $numFechas <= 0 ) { // no hay ninguna fecha en $fechas
$fechasA[0] = $fechaN[0];
$fechasA[1] = $fechaN[1];
} else {
$insertado = 0;
$nA = 0;
$n = 0;
while ((!$insertado) and ($n < $numFechas) ) {
if ( ($fechaN[0] > $fechas[$n]) and ($fechaN[1] < $fechas[$n+1]) ) {
// el intervalo a insertar está dentro de un intervalo existente:
// ej.: insertar 10/01/05 - 15/01/05 en intervalo 01/01/05 - 30/01/05
$fechasA[$nA++] = $fechas[$n];
$fechasA[$nA++] = mktime(0,0,0,date("m", $fechaN[0]),date("d", $fechaN[0])-1,date("Y", $fechaN[0]));
$fechasA[$nA++] = $fechaN[0];
$fechasA[$nA++] = $fechaN[1];
$fechasA[$nA++] = mktime(0,0,0,date("m", $fechaN[1]),date("d", $fechaN[1])+1,date("Y", $fechaN[1]));
$fechasA[$nA++] = $fechas[$n+1];
$insertado = 1; $n += 2;
} else if ( ($fechaN[0] <= $fechas[$n]) and ($fechaN[1] < $fechas[$n+1]) ) {
// el intervalo a insertar está por el lado izquierdo:
// ej.: insertar 01/01/05 - 15/01/05 en intervalo 05/01/05 - 25/01/05
$fechasA[$nA++] = $fechaN[0];
$fechasA[$nA++] = $fechaN[1];
if ($fechaN[1] >= $fechas[$n]) {
$fechasA[$nA++] = $fechaN[1] +1;
$fechasA[$nA++] = mktime(0,0,0,date("m", $fechaN[1]),date("d", $fechaN[1])+1,date("Y", $fechaN[1]));
$n ++;
} else {
$fechasA[$nA++] = $fechas[$n++];
}
$fechasA[$nA++] = $fechas[$n++];
$insertado = 1;
} else if ( (($numFechas < ($n+3)) or (($numFechas >= ($n+4)) and ($fechaN[1] < $fechas[$n+3]))) and (($fechaN[0] > $fechas[$n]) and ($fechaN[1] >= $fechas[$n+1]) and ($fechaN[0] <= $fechas[$n+1] )) ) {
// el intervalo a insertar está en el lado derecho
$fechasA[$nA++] = $fechas[$n++];
$fechasA[$nA++] = mktime(0,0,0,date("m", $fechaN[0]),date("d", $fechaN[0])-1,date("Y", $fechaN[0]));
$fechasA[$nA++] = $fechaN[0];
$fechasA[$nA++] = $fechaN[1];
$n++;
if ( ($numFechas >= ($n+2)) and ($fechaN[1] < $fechas[$n+1]) ) {
$fechasA[$nA] = mktime(0,0,0,date("m", $fechasA[$nA-1]),date("d", $fechasA[$nA-1])+1,date("Y", $fechas[$nA-1]));
$nA ++;
$fechasA[$nA++] = $fechas[$n+1];
$n += 2;
}
$insertado = 1;
} else {
$fechasA[$nA++] = $fechas[$n++];
$fechasA[$nA++] = $fechas[$n++];
}
}
while( $n < $numFechas ) {
$fechasA[$nA++] = $fechas[$n++];
}
}
$fechas = $fechasA;
}
?>
Respuesta
1
Supongo que TBFechas mantiene períodos de reservas... ¿podrías explicarme PORQUÉ necesitas eso? Porque si el campo id es autonumerado no vas a poder hacerlo... explícamelo y vemos una solución alternativa.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas