Problema PHP/SQL consulta disponibilidad de Hotel.
Necesito ayuda de tu experiencia en SQL/PHP porque la verdad no tengo claro como realizarlo, te explico.
Estoy desarrollando una herramienta de reserva para un hotelito, la consulta que quiero realizar es para saber la disponibilidad del hotel para eso realizo una consulta SQL.
Tengo una tabla que se llama detalle_reservas tiene los siguientes campos (clave, c_reserva, c_habitacion, fecha_desde, fecha_hasta), para saber la disponibilidad verifico esta tabla más la tabla reservas que tiene los datos de la reserva, datos del cliente, también la fecha y otros datos.
Pinto funciones y variables de control para que lo veas:
173-Doble uso individual 3-22/06/2010-23/06/2010- Bloqueo: 0 - Disponibilidad: 1
Para realizar un control muestro por pantalla las diferentes funciones, una es el bloqueo y otra la disponibilidad. Donde se encuentra el error es la disponibilidad de la habitación pero es por la consulta SQL me devuelve que se ha encontrado un registro.
La consulta que realizar para devolverme 1 es la siguiente cuenta en la tabla detalle_reservas unida con reservas si existe alguna reserva en esa fecha:
SELECT count(*) as cuenta FROM detalle_reservas LEFT JOIN reservas ON reservas.clave = detalle_reservas.c_reserva WHERE ((reservas.c_estado<>1 and reservas.c_estado<>8 and reservas.c_estado<>9 AND reservas.c_estado<>2) OR (reservas.c_estado=2 AND tpv_ok=true)) AND detalle_reservas.c_habitacion=173 AND ( (reservas.fecha_desde<='22/06/2010' AND reservas.fecha_hasta>='23/06/2010') OR (reservas.fecha_desde>='22/06/2010' AND reservas.fecha_hasta<='23/06/2010') OR (reservas.fecha_desde>='22/06/2010' AND reservas.fecha_hasta>='23/06/2010') OR (reservas.fecha_desde<='22/06/2010' AND reservas.fecha_hasta<='23/06/2010') AND reservas.fecha_hasta>'22/06/2010' )
La consulta se construye porque existen diferentes estados y solo controlo varios en concreto, luego que el pago se haya realizado por el tpv y a partir de aquí comparamos fechas (pienso que el error estaría aquí en la forma de comparar las fechas).
El registro que cuenta (te muestro el registro que encuentra) por ahora (lógicamente porque existe una reserva para esa habitación pero para otra fecha que no coincide) es la siguiente:
PhpPgAdmin - Resultado de la consulta
c_habitacion
fecha_desde
fecha_hasta
tpv_ok
173
2010-07-09
2010-07-12
Verdadero
El sistema de bases de datos es PostgreSQL, pero es una consutal SQL normal, es posible que existe una forma más eficiente de comparar fechas para este tipo de cuestiones pero las desconozco.
¿Qué tendría que cambiar en la consulta para realizar un SQL correcto?
Estoy desarrollando una herramienta de reserva para un hotelito, la consulta que quiero realizar es para saber la disponibilidad del hotel para eso realizo una consulta SQL.
Tengo una tabla que se llama detalle_reservas tiene los siguientes campos (clave, c_reserva, c_habitacion, fecha_desde, fecha_hasta), para saber la disponibilidad verifico esta tabla más la tabla reservas que tiene los datos de la reserva, datos del cliente, también la fecha y otros datos.
Pinto funciones y variables de control para que lo veas:
173-Doble uso individual 3-22/06/2010-23/06/2010- Bloqueo: 0 - Disponibilidad: 1
Para realizar un control muestro por pantalla las diferentes funciones, una es el bloqueo y otra la disponibilidad. Donde se encuentra el error es la disponibilidad de la habitación pero es por la consulta SQL me devuelve que se ha encontrado un registro.
La consulta que realizar para devolverme 1 es la siguiente cuenta en la tabla detalle_reservas unida con reservas si existe alguna reserva en esa fecha:
SELECT count(*) as cuenta FROM detalle_reservas LEFT JOIN reservas ON reservas.clave = detalle_reservas.c_reserva WHERE ((reservas.c_estado<>1 and reservas.c_estado<>8 and reservas.c_estado<>9 AND reservas.c_estado<>2) OR (reservas.c_estado=2 AND tpv_ok=true)) AND detalle_reservas.c_habitacion=173 AND ( (reservas.fecha_desde<='22/06/2010' AND reservas.fecha_hasta>='23/06/2010') OR (reservas.fecha_desde>='22/06/2010' AND reservas.fecha_hasta<='23/06/2010') OR (reservas.fecha_desde>='22/06/2010' AND reservas.fecha_hasta>='23/06/2010') OR (reservas.fecha_desde<='22/06/2010' AND reservas.fecha_hasta<='23/06/2010') AND reservas.fecha_hasta>'22/06/2010' )
La consulta se construye porque existen diferentes estados y solo controlo varios en concreto, luego que el pago se haya realizado por el tpv y a partir de aquí comparamos fechas (pienso que el error estaría aquí en la forma de comparar las fechas).
El registro que cuenta (te muestro el registro que encuentra) por ahora (lógicamente porque existe una reserva para esa habitación pero para otra fecha que no coincide) es la siguiente:
PhpPgAdmin - Resultado de la consulta
c_habitacion
fecha_desde
fecha_hasta
tpv_ok
173
2010-07-09
2010-07-12
Verdadero
El sistema de bases de datos es PostgreSQL, pero es una consutal SQL normal, es posible que existe una forma más eficiente de comparar fechas para este tipo de cuestiones pero las desconozco.
¿Qué tendría que cambiar en la consulta para realizar un SQL correcto?
1 Respuesta
Respuesta de Jorge Vila