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

Consulta con comparacion de fechas

Estas en el tema de Consulta con comparacion de fechas en el foro de Mysql en Foros del Web. Hola amigos. Estoy haciendo mi proyecto de fin de carrera y me ha surgido una duda sobre una consulta. Os explico un poco de que ...
  #1 (permalink)  
Antiguo 11/12/2009, 23:37
 
Fecha de Ingreso: noviembre-2009
Ubicación: Castelló de la Plana
Mensajes: 71
Antigüedad: 14 años, 5 meses
Puntos: 3
Consulta con comparacion de fechas

Hola amigos.

Estoy haciendo mi proyecto de fin de carrera y me ha surgido una duda sobre una consulta. Os explico un poco de que va el tema:

El proyecto de fin de carrera trata de hacer una Web de una empresa que alquila coches. Mi duda viene cuando quiero comprobar en la BBDD si un vehículo esta ya reservado.

Conceptualmente se como hacerlo, el problema viene al generar la consulta, que no se muy bien como tratar el tema de las fechas. Os pongo mi "contextualización":

Código:
FECHA_INI -> Esto es el dia que empieza una reserva ya guardada en la BBDD.
FECHA_FIN -> Esto el dia que finaliza la reserva.
NUEVA_INI  -> Esto es el dia que empieza la nueva reserva que quiero comprobar
NUEVA_FIN -> Y esto el dia que finaliza

Conceptualización:

IF ( FECHA_INI < NUEVA_FIN ) NO MOSTRAR VEHICULO
ELSE IF (NUEVA_INI < FECHA_FIN): NO MOSTRAR VEHICULO
ESE IF (NUEVA_INI > FECHA_INI  AND NUEVA_FIN < FECHA_FIN) : NO MOSTRAR VEHICULO
ELSE: MOSTRAR VEHICULO
Esa es la idea, entonces mi problema viene al generar la consulta. Mi idea va por aqui:

Código:
SELECT "aqui los datos del vehiculo" FROM vehiculos WHERE (SELECT matricula, fecha_ini, fecha_fin FROM reservas WHERE $nueva_ini, $nueva_fin < fecha_ini OR  $nueva_ini, $nueva_fin > fecha_fin)"
La condición del segundo WHERE seria lo que genera el ultimo ELSE de la conceptualizacion.

Bueno, llegado a este punto el problema es como escribir la condicion del segundo WHERE. Si me echais una mano estaré eternamente agradecido.

Espero haberme explicado bien. Si no lo entendeis os prepararé una imagen explicativa.

Muchas gracias a todos. Un saludo!!
  #2 (permalink)  
Antiguo 12/12/2009, 06:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta con comparacion de fechas

Se entiende, pero estás aplicando lógica de programador y no de DBA, por eso se te complica.
El tema es que no te debe importar si en ciertas condiciones la opción es no mostrar. Lo que debe importarte es cuál es la condición que debe cumplir el vehículo que debe ser mostrado, ya que el resto de las alternativas son irrelevantes, y esta es una sola: Las fechas de la reserva no pueden cruzarse ni superponerse:

Código MySQL:
Ver original
  1. SELECT V.*
  2. FROM vehiculos V INNER JOIN reservas R ON V.id_vehiculo = R.id_vehiculo
  3.     NOT ($nueva_ini BETWEEN FECHA_INI, FECHA_FIN)
  4.     AND
  5.     NOT ($nueva_fin  BETWEEN FECHA_INI, FECHA_FIN)
  6. GROUP BY V.id_vehiculo;

Eso te devolverá un listado de vehiculos que no tienen reservas para el período indicado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/12/2009, 12:38
 
Fecha de Ingreso: noviembre-2009
Ubicación: Castelló de la Plana
Mensajes: 71
Antigüedad: 14 años, 5 meses
Puntos: 3
Respuesta: Consulta con comparacion de fechas

Hola!

Aplico logica de programador porque, al fin y al cabo, eso soy, jejeje. La consulta la entiendo perfectamente, te has explicado genial.

Esta es la consulta que he genereado:

Código PHP:

$consulta
="SELECT * FROM vehicles V 
INNER JOIN reserves R ON V.matricula = R.matricula 
WHERE 
  NOT ('"
.$dia_recollida_BBDD."' BETWEEN R.data_inici AND R.data_fi) 
  AND NOT ('"
.$dia_desti_BBDD."' BETWEEN R.data_inici AND R.data_fi) 
  AND V.disponibilitat = 1 
  AND V.oficina = '"
.$oficina_recollida."' 
  AND V.classe = '"
.$tipus_vehicle."'
  GROUP BY V.matricula  
  LIMIT $inicio, $registros"

El problema que me surge ahora es que solo me salen los vehículos de la tabla "reservas" y lo que yo quiero es que me salgan los vehículos que están en la tabla "vehiculos" pero no tienen reserva para el periodo introducido por el usuario...

Pues eso, voy a seguir investigando. Si se os ocurre algo estaré muy agradecido.

Muchas gracias!

Última edición por Rubix; 12/12/2009 a las 18:56
  #4 (permalink)  
Antiguo 12/12/2009, 12:50
 
Fecha de Ingreso: noviembre-2009
Ubicación: Castelló de la Plana
Mensajes: 71
Antigüedad: 14 años, 5 meses
Puntos: 3
Respuesta: Consulta con comparacion de fechas

/* Duplicado por error */

Última edición por Rubix; 12/12/2009 a las 18:39
  #5 (permalink)  
Antiguo 13/12/2009, 10:31
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta con comparacion de fechas

usa LEFT JOIN en lugar de INNER JOIN
  #6 (permalink)  
Antiguo 13/12/2009, 12:23
 
Fecha de Ingreso: noviembre-2009
Ubicación: Castelló de la Plana
Mensajes: 71
Antigüedad: 14 años, 5 meses
Puntos: 3
Respuesta: Consulta con comparacion de fechas

Hola!

Hoy, despues de varios dias sin dormir, he conseguido hacer la puñetera consulta. Así me ha quedado:

Código:
$consulta="SELECT v.* FROM vehicles v 
    LEFT JOIN reserves r ON v.matricula =r.matricula 
    WHERE v.matricula != 
      (SELECT matricula FROM reserves WHERE 
      ('".$dia_recollida_BBDD."' BETWEEN data_inici AND data_fi)
       OR ('".$dia_desti_BBDD."' BETWEEN data_inici AND data_fi)) 
    AND v.disponibilitat = 1 
    AND v.oficina = '".$oficina_recollida."' 
    AND v.classe = '".$tipus_vehicle."'";
				
$resultat= mysql_query ($consulta);
		
if (mysql_num_rows($resultat) == 0){
		$consulta="SELECT * FROM vehicles WHERE disponibilitat = 1 
                    AND oficina = '".$oficina_recollida."' 
                    AND classe = '".$tipus_vehicle."'";
		
	           $resultat= mysql_query ($consulta);
}
En la primera consulta saco los vehiculos que no coinciden con ninguna reserva... el problema es que si no hay alguna coincidencia con alguna reserva no me devuelve ninguna matricula, con lo que la consulta no arroja resultados.

Para eso uso la 2ª consulta. Si no hay resultados en la primera consulta es que todos los vehiculos de esa clase estan disponibles para ese periodo de tiempo. Pues un SELECT * y arreglado.

Dios! Por fin lo he conseguido!!

Muchas gracias a todos los que me han ayudado, que aunque no ha sido la solucion definitiva me han marcado el camino para llegar a ella.

Saludos!

Pd.- Doy por cerrado el hilo.
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 07:31.