Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

validar rango de fechas

Estas en el tema de validar rango de fechas en el foro de Bases de Datos General en Foros del Web. pk, puse este post tambien en base de datos.. a ver si se puede resolver algo... Hola.. mm pues resulta que tengo que verificar en ...
  #1 (permalink)  
Antiguo 17/03/2005, 11:17
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
validar rango de fechas

pk, puse este post tambien en base de datos.. a ver si se puede resolver algo...

Hola..

mm pues resulta que tengo que verificar en una aplicación si puedo o no realizar una reserva de determinado material.. es decir si esta la reserva ya hecha de ese material, en las fechas que el usuario dice.. entonces debe salir el mensaje de que no puede.. la programación es en php y la base de datos mysql 4.0.18

hago esto:


Código PHP:
$fecha1 "2005-03-15"
//$fecha2 = "2005-03-22" 
$cdmaterial // variable que tiene el código del material. 
$RESULT=mysql_query("SELECT * FROM tabla1 tr, tabla 2trm 
                            WHERE trm.cdmaterial = '$cdmaterial' 
                            AND   tr.feinicio <=  '$fecha1' 
                            AND   tr.fefin >=  '$fecha1"
,$conectar); 
Ahora.. todo va bien si ingreso reservas entre el 15 y 22 del mes 03... porque si ya existe esa reserva de ese material en esa fecha.. me sale el mensaje de error..

El lio viene cuando mi fecha1 no esta en el rango.. si no que es menor, es decir no es el 15 del mes 03 por ejemplo si no el 12 ó 11 pues si me deja realizar la reserva... algo me falta! mm alguna validación o que se yo!... ideas??

saludos

Última edición por Salome; 17/03/2005 a las 11:47
  #2 (permalink)  
Antiguo 17/03/2005, 11:35
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 11 meses
Puntos: 16
Hola,

Dos cositas:

- ¿Que tipo de datos son feinicio y fefin?

- ¿Donde usas $fecha2? Es que en la consulta solo usas $fecha1.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 17/03/2005, 11:37
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
feinicio y fefin son datos tipo date
es fecha1 porque solo valido esa fecha con las otras dos que tengo en la base de datos..

Pues.. fecha1 seria como mi fecha inicial de la nueva reserva.. y esa quien no debe estar en el rango de fecha_inicio y fecha_fin de la reserva ya hecha de ese material...

Última edición por Salome; 17/03/2005 a las 11:45
  #4 (permalink)  
Antiguo 17/03/2005, 12:02
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 11 meses
Puntos: 16
Aqui ya me pierdo. Con esa consulta sacas todos los registros cuya feinicio sea menor/igual que fecha1 y que su fefin sea mayor/igual que fecha1. Es decir:

feinicio <= fecha1 <= fefin

Si fecha1 es menor que todos los feinicio, no se cumple la condicion.

Creo que tu problema es que no estas usando fecha2. El problema de reservas es un problema de superposicion de rangos. Es decir:

feinicio <= fecha1 <= fefin
feinicio <= fecha2 <= fefin
fecha1 <= fefin <= fecha2

Si alguna de estas 3 condiciones se cumple, los rangos se superponen.

saludos.

PD: Ahora mismo no estoy seguro si las 3 condiciones son correctas, las he puesto de cabeza. Pero con un lapiz y un papel, representas los rangos y encuentras las condiciones de superposicion.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 17/03/2005, 12:18
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
ok.. gracias.. seguiré con lápiz y papel!!!
  #6 (permalink)  
Antiguo 17/03/2005, 15:13
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
Bueno he llegado a esto:

Código PHP:
$fecha1="2005-03-13";
$fecha2="2005-03-18";
$RESULT=mysql_query("SELECT count(*)
        FROM TBLI_RESERVAS tr, TBLI_RESERVA_MATERIALES trm
        WHERE trm.NMMATERIAL = '$NMMATERIAL'
        AND tr.NMRESERVA=trm.NMRESERVA
        AND NOT ((tr.FEINICIO>'$fecha1'  AND tr.FEINICIO>'$fecha2')
        OR
        (tr.FEFIN<'$fecha1'  AND tr.FEFIN<'$fecha2'))"
,$conectar);

if (
mysql_num_rows($RESULT) != 0) {
   
header("Location: $redir?error:_mesaje=3");
   exit;
 } 
cuando realizo el query en mysql directamente... no tengo problema me sale bien todo.. siendo asi .. 0 si puedo reservar y 1 si no se puede reservar...

entonces el lio ahora esta.. en que ya nunca me deja reservar... y eso que estoy diciendo que si es !=0 no me deje reservar... no se que pasa.. sera algo de sintaxis o que?.. porque como les cuento, en mysql si me sale como debe.. y ya al ponerlo en código nunca me deja reservar como si siempre fuera ==0 y si cambio ese != por igual.. ahi si se enloquece porque me deja hacer reservas asi no se pueda.

Última edición por Salome; 18/03/2005 a las 13:42
  #7 (permalink)  
Antiguo 18/03/2005, 13:45
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
:-p Enloqueceré!!!
  #8 (permalink)  
Antiguo 18/03/2005, 14:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
Salome .. los problemas de sentencias SQL es mejor que los derives al foro de "Base de datos" ... eso ya no tienen nada de PHP (el "fuerte" es tu sentencia SQL)

Muevo tu mensaje a dicho foro.

Un saludo,
  #9 (permalink)  
Antiguo 18/03/2005, 15:27
Avatar de jrp01  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 2.702
Antigüedad: 20 años
Puntos: 0
Primero por que no cambias el = por un inner join para unir las tablas y despues mandas un echo para ver que esta mandando la consulta para ver que contiene la consulta
  #10 (permalink)  
Antiguo 18/03/2005, 15:30
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
mmmm no entiendo... pues.. la consulta me devuelve.. en mysql... 0 si no encuentra registro.. y 1 si encuentra... ya al ponerlo en php el mysql_num_rows.. me devuelve inverso.. y luego ahi es donde se enloquece.. el query como tal hace lo que debe.. pues supongo... para que hacerle el join? (pues pregunto para ver si me desenredo con esto... )
  #11 (permalink)  
Antiguo 18/03/2005, 15:59
Avatar de jrp01  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 2.702
Antigüedad: 20 años
Puntos: 0
a no uses > mejor usa el BETWEEN

where fecha BETWEEN fecha1 and fecha2

Una pregunta de que tabla saca el count?
  #12 (permalink)  
Antiguo 18/03/2005, 16:01
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
el count.. TBLI_RESERVAS

Última edición por Salome; 18/03/2005 a las 16:06
  #13 (permalink)  
Antiguo 18/03/2005, 16:09
Avatar de jrp01  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 2.702
Antigüedad: 20 años
Puntos: 0
y esto que fin tiene

AND tr.NMRESERVA=trm.NMRESERVA

Bueno creo que seria asi:

SELECT COUNT(TBLI_RESERVAS.NMMATERIAL)
FROM TBLI_RESERVAS inner join TBLI_RESERVA_MATERIALES on
(TBLI_RESERVAS.NMMATERIAL = TBLI_RESERVAS.NMMATERIAL) Where TBLI_RESERVA_MATERIALES.NMMATERIAL='$NMMATERIAL'
and TBLI_RESERVAS.FEINICIO between $fecha1 and $fecha2
OR
TBLI_RESERVAS.FEFIN between '$fecha1' AND '$fecha2'

Bueno pero si solo quieres un count por que 2 tablas?

SELECT COUNT (NMMATERIAL)
FROM TBLI_RESERVAS Where TBLI_RESERVAS.NMMATERIAL='$NMMATERIAL'
and TBLI_RESERVAS.FEINICIO between $fecha1 and $fecha2
OR
TBLI_RESERVAS.FEFIN between '$fecha1' AND '$fecha2'

Última edición por jrp01; 18/03/2005 a las 16:11
  #14 (permalink)  
Antiguo 18/03/2005, 16:09
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
ok.. miraré que pasa..

Última edición por Salome; 18/03/2005 a las 16:10
  #15 (permalink)  
Antiguo 18/03/2005, 16:13
Avatar de jrp01  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 2.702
Antigüedad: 20 años
Puntos: 0
Arriba hice una aclaracion de por que tienes que unir 2 tablas? si solo necesitas un count de un campo de una tabla
  #16 (permalink)  
Antiguo 18/03/2005, 16:18
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
mmm mira..

NMMATERIAL, NMRESERVA estan en TBLI_RESERVA_MATERIALES
y en TBLI_RESERVAS estan NMRESERVA, FEINICIO, FEFIN.



si yo realizo el query asi como lo tengo en mysql.. directamente sin php.. me funciona... y luego no!.. pero no entiendo porque

Última edición por Salome; 18/03/2005 a las 16:21
  #17 (permalink)  
Antiguo 18/03/2005, 16:24
Avatar de jrp01  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 2.702
Antigüedad: 20 años
Puntos: 0
SELECT COUNT(TBLI_RESERVAS.NMMATERIAL)
FROM TBLI_RESERVAS inner join TBLI_RESERVA_MATERIALES on
(TBLI_RESERVAS.NMRESERVA = TBLI_RESERVA_MATERIALES.NMRESERVA) Where TBLI_RESERVA_MATERIALES.NMMATERIAL='$NMMATERIAL'
and TBLI_RESERVAS.FEINICIO between $fecha1 and $fecha2
OR
TBLI_RESERVAS.FEFIN between '$fecha1' AND '$fecha2'

Habia un pequeño error de copiar y pegar
  #18 (permalink)  
Antiguo 22/03/2005, 08:39
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
nada que me funciona... tiendo a enloquecer!
  #19 (permalink)  
Antiguo 22/03/2005, 08:46
Avatar de jrp01  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 2.702
Antigüedad: 20 años
Puntos: 0
Me puedes mandar tu db? para hacer la consulta

a jrp_gnr[@]yahoo[.]com
  #20 (permalink)  
Antiguo 22/03/2005, 08:49
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
Listo, ya te envié el mail...

Última edición por Salome; 22/03/2005 a las 09:18
  #21 (permalink)  
Antiguo 22/03/2005, 10:37
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
EEPPPAAAAA lo logré ya funciona.. y ahi les va el query..
Código PHP:
$conectar Conectarse();   //conexion.
//$fecha1 = '2005-03-01';
//$fecha2 = '2005-03-08';
$RESULT1=mysql_query("SELECT count(*) AS resultado
                             FROM TBLI_RESERVAS tr, TBLI_RESERVA_MATERIALES trm
                             WHERE trm.NMMATERIAL = '$NMMATERIAL'
                             AND tr.NMRESERVA=trm.NMRESERVA
                             AND NOT((tr.FEINICIO >'$fecha1'  AND tr.FEINICIO >'$fecha2')
                             OR
                             (tr.FEFIN <'$fecha1'  AND tr.FEFIN <'$fecha2'))"
,$conectar);
while (
$ROW1 mysql_fetch_array($RESULT1))
{
   if (
$ROW1['resultado'] == 0)
   {
       echo 
$ROW1['resultado'];
       echo 
"si puedo reservar";
   }
   else {
       echo 
$ROW1['resultado'];
        echo 
"ya esta reservado";
   }


Última edición por Salome; 22/03/2005 a las 10:45
  #22 (permalink)  
Antiguo 22/03/2005, 11:53
Avatar de jrp01  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 2.702
Antigüedad: 20 años
Puntos: 0
Solo una cosa vi las tablas y no tienes definidas llaves foraneas bueno poniendo llaves queda asi.

Código:
select TBLI_RESERVA_MATERIALES.NMATERIAL, TBLI_RESERVAS.NMRESERVA,
 TBLI_RESERVAS.FEINICIO, TBLI_RESERVAS.FEFIN from TBLI_RESERVAS inner join
TBLI_RESERVA_MATERIALES on(TBLI_RESERVAS.NMRESERVA=TBLI_RESERVA_MATERIALES.NMRESERVA) where TBLI_RESERVA_MATERIALES.NMATERIAL=22 and
 not(TBLI_RESERVAS.FEINICIO  between '2004/01/01' and '2004/01/30' or  TBLI_RESERVAS.FEFIN between '2004/01/01' and '2004/01/30')


Las tablas:


CREATE TABLE TBLI_RESERVAS ( 
   NMRESERVA int(8) NOT NULL auto_increment, 
   CDUSUARIO INT(5) NOT NULL , 
   FEINICIO date  NOT NULL, 
   FEFIN date  NOT NULL, 
   constraint jsdf PRIMARY KEY NMRESERVA(NMRESERVA)
) 

CREATE TABLE TBLI_RESERVA_MATERIALES ( 
   NMRESERVA int(8) not null, 
   NMATERIAL int(5) not null, 
   FEENTREGA date, 
constraint jhdf primary key (NMRESERVA, NMATERIAL),
constraint dfy foreign key (NMRESERVA) references TBLI_RESERVAS(NMRESERVA)
    )
Solo falta la llave foranea del material solo se cambia por un count

Última edición por jrp01; 22/03/2005 a las 11:55
  #23 (permalink)  
Antiguo 22/03/2005, 11:57
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 21 años, 6 meses
Puntos: 1
ok, gracias.. pero el lio no estaba en la base de datos.. ni en el query como quedo al final.. el problema lo tenia en un campo que estaba mal definido.. por eso siempre funcionaba en otra parte...

Gracias por tu colaboración
  #24 (permalink)  
Antiguo 22/03/2005, 12:21
Avatar de jrp01  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 2.702
Antigüedad: 20 años
Puntos: 0
De nada
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:10.