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

Query con resultado en 2 registros

Estas en el tema de Query con resultado en 2 registros en el foro de Mysql en Foros del Web. Buenas tardes, Estoy haciendo intentando hacer un sistema de reservas para un hotel y me encontre con el problema que si alguien consulta una reserva ...
  #1 (permalink)  
Antiguo 07/08/2008, 12:00
NHS
 
Fecha de Ingreso: junio-2002
Ubicación: Todos lados
Mensajes: 92
Antigüedad: 21 años, 10 meses
Puntos: 0
Query con resultado en 2 registros

Buenas tardes,
Estoy haciendo intentando hacer un sistema de reservas para un hotel y me encontre con el problema que si alguien consulta una reserva para ingresar el 25/08 y salir el 03/09
No se como hacer porque tengo un cambio de tarifa de agosto a septiembre

la estructura de la DB

tengo una tabla
habitaciones con los campos

hab_id,hab_nombre
los registros son
1,simple
2,suite


Otra tabla tarifas
tarifa_id,tarifa_desde,tarifa_hasta,tarifa_valor_n oche
1,2008-08-01,2008-08-31,100
2,2008-09-01,2008-09-31,120


A todo esto yo tendria que mostrar el valor de la tarifa en agosto y la de septiembre

Se puede hacer de alguna manera con SQL? o lo tengo que hacer por programacion??
Estoy usando mysql 5 y php para la programacion.

Espero su ayuda muchas gracias.
  #2 (permalink)  
Antiguo 07/08/2008, 12:21
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Query con resultado en 2 registros

La consulta va a depender mucho de las tarifas; si sólo tienes dos diferentes y los días reservados no irán más allá de dos tarifas, es decir, no se dará el caso de que puedan tener que aplicarse tres tarifas, puedes probar esto:

SELECT DISTINCT tarifa_valor_noche, tarifa_desde, tarifa_hasta
FROM tarifas
WHERE '2008-08-25'
BETWEEN tarifa_desde
AND tarifa_hasta
OR '2008-08-26'
BETWEEN tarifa_desde
AND tarifa_hasta

He usado la fecha de ingreso y la de salida las he buscado en el rango de las tarifas. La primera estaría en el rango de la primera tarifa, y la segunda en la de la segunda. Pruébalo.

Como puedes suponer esto puede complicarse si la reserva pudiera ir más allá de dos tarifas...
Para eso habría que estudiar alguna otra solución.

Última edición por jurena; 07/08/2008 a las 12:29
  #3 (permalink)  
Antiguo 07/08/2008, 12:36
Avatar de Taldreakan  
Fecha de Ingreso: julio-2008
Mensajes: 128
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Query con resultado en 2 registros

Puedes probar con UNION

Código HTML:
SELECT * FROM tarifas WHERE mes = MONTH('2008-08-25')
UNION
SELECT * FROM tarifas WHERE mes = MONTH('2008-09-03')
GROUP BY mes;
Eso si solo quieres extraer las tarifas, si quieres ademas calcular el costo total de reservacion en base a los dias correspondientes a cada mes habria que hacer otra cosa.

Espero te sirva.
  #4 (permalink)  
Antiguo 07/08/2008, 12:49
NHS
 
Fecha de Ingreso: junio-2002
Ubicación: Todos lados
Mensajes: 92
Antigüedad: 21 años, 10 meses
Puntos: 0
Respuesta: Query con resultado en 2 registros

Gracias jurena por tu pronta respuesta

Funciono, pero le intente agregar otra tarifa con una vigencia intermedia y me mostro la primera y la ultima, no supe como mejorar tu query, me lo podrias explicar un poco mejor

Última edición por NHS; 07/08/2008 a las 13:11
  #5 (permalink)  
Antiguo 07/08/2008, 13:11
NHS
 
Fecha de Ingreso: junio-2002
Ubicación: Todos lados
Mensajes: 92
Antigüedad: 21 años, 10 meses
Puntos: 0
Respuesta: Query con resultado en 2 registros

Cita:
Iniciado por Taldreakan Ver Mensaje
Puedes probar con UNION

Código HTML:
SELECT * FROM tarifas WHERE mes = MONTH('2008-08-25')
UNION
SELECT * FROM tarifas WHERE mes = MONTH('2008-09-03')
GROUP BY mes;
Eso si solo quieres extraer las tarifas, si quieres ademas calcular el costo total de reservacion en base a los dias correspondientes a cada mes habria que hacer otra cosa.

Espero te sirva.
Pero la idea es calcular el costo total de la estadia
  #6 (permalink)  
Antiguo 07/08/2008, 13:47
Avatar de Taldreakan  
Fecha de Ingreso: julio-2008
Mensajes: 128
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Query con resultado en 2 registros

Creo que lo mejor es que realices los calculos de dias y armes las consultas desde PHP.

Se debe poder desde MySQL pero la verdad no tengo idea, si encuentro algo lo comento.
  #7 (permalink)  
Antiguo 07/08/2008, 13:52
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Query con resultado en 2 registros

Primero hay que localizar y luego veremos el modo de calcular el precio de la estancia.

Para sacar las tarifas afectadas, esta consulta tal vez podría valerte. Sé que Quimfv ofreció otras soluciones, y tal vez también en otro de los foros de bases de datos, aunque no recuerdo que se llegara a calcular el precio...

Mi lógica es la siguiente:
El rango de fechas de la reseva y de las tarifas pueden controlarse si piensas que si la fecha de reserva desde es anterior o igual a la de tarifa_desde, la fecha de reserva hasta debe ser posterior o igual que la de tarifa_desde; pero si la fecha de reserva desde es posterior o igual a la fecha de tarifa desde, la fecha de reserva desde debe ser anterior o igual a la fecha de tarifa hasta.
Uso una reserva con fecha desde '2008-08-25' y fecha hasta '2008-10-30'

SELECT tarifa_valor_noche, tarifa_desde, tarifa_hasta '2008-10-30'
FROM tarifas
WHERE (
'2008-08-25' <= tarifa_desde
AND '2008-10-30' >= tarifa_desde
)
OR (
'2008-08-25' >= tarifa_desde
AND '2008-08-25' <= tarifa_hasta
)

Última edición por jurena; 08/08/2008 a las 04:32
  #8 (permalink)  
Antiguo 07/08/2008, 14:00
NHS
 
Fecha de Ingreso: junio-2002
Ubicación: Todos lados
Mensajes: 92
Antigüedad: 21 años, 10 meses
Puntos: 0
Respuesta: Query con resultado en 2 registros

Jurena, creo que con este ultimo query va, estoy haciendo pruebas
  #9 (permalink)  
Antiguo 07/08/2008, 14:07
NHS
 
Fecha de Ingreso: junio-2002
Ubicación: Todos lados
Mensajes: 92
Antigüedad: 21 años, 10 meses
Puntos: 0
Respuesta: Query con resultado en 2 registros

agregue mas tarifas de meses futuros noviembre / diciembre y cuando hago el query tambien me los trae en el resultado
  #10 (permalink)  
Antiguo 07/08/2008, 14:41
NHS
 
Fecha de Ingreso: junio-2002
Ubicación: Todos lados
Mensajes: 92
Antigüedad: 21 años, 10 meses
Puntos: 0
Respuesta: Query con resultado en 2 registros

Con una ayuda de mi hno el lo pudo resolver con ms-sql

Código PHP:
SELECT Total,SOBRAtotal-sobra as diasOKTARIFA_VALOR FROM (
SELECT '2008-09-06' tarifa_desde as Total, (CASE WHEN '2008-09-06'-tarifa_hasta <0 THEN 0 ELSE '2008-09-06'-tarifa_hasta END) AS Sobra ,
t1.* FROM Tarifa AS t1 WHERE tarifa_Hasta>='2008-08-26' AND tarifa_Desde <= '2008-09-06'
T3 
el query original era

Código PHP:
SELECT Total,SOBRAtotal-sobra as diasOKTARIFA_VALOR
FROM
(
Select
CAST
(('2008-09-06'-tarifa_desde) AS int) as Total,
(case 
when CAST(('2008-09-06'-tarifa_hasta) as int)<0 THEN 0 ELSE CAST(('2008-09-06'-tarifa_hasta) as intEND) as Sobra ,

t1.* From Tarifas t1


Where tarifa_Hasta
>='2008-08-26' And tarifa_Desde<='2008-09-06'
T3 
El tema es como simulo el CAST (int) en mysql y lo estoy probando en dos mysql
en 5.0.27-community-nt funciona y en 5.0.45-community-nt no devuelva nada ni siquiera error

  #11 (permalink)  
Antiguo 07/08/2008, 14:44
NHS
 
Fecha de Ingreso: junio-2002
Ubicación: Todos lados
Mensajes: 92
Antigüedad: 21 años, 10 meses
Puntos: 0
Respuesta: Query con resultado en 2 registros

Cita:
Iniciado por NHS Ver Mensaje
El tema es como simulo el CAST (int) en mysql y lo estoy probando en dos mysql
en 5.0.27-community-nt funciona y en 5.0.45-community-nt no devuelva nada ni siquiera error

olvídense de esto es un problema en el phpmyadmin porque desde consola va bien
  #12 (permalink)  
Antiguo 08/08/2008, 01:44
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Query con resultado en 2 registros

a ver si esto:
Si las tarifas son consecutivas, no se montan una sobre otras y las hay para todo el año, creo que esta consulta te valdrá. Esto es importante, el año tiene que estar cubierto completo y las tarifas no pueden solaparse.
Te saca el número de días afectados por cada tarifa con su valor económico.
He puesto dos fechas de referencia, el 2008-08-25 sería la entrada, y la salida el 2008-10-15. A mí me ha funcionado muy bien. Para la suma total, sólo tendrías que sumar luego con tu programación el resultado de las cantidades devueltas.

Cita:
SELECT '2008-08-25' as entrada, '2008-10-15' as salida, tarifa_desde, tarifa_hasta, tarifa_valor_noche,case when '2008-08-25' <= tarifa_desde AND '2008-10-15' >= tarifa_hasta then DATEDIFF(tarifa_hasta,tarifa_desde)+ 1 when '2008-08-25' <= tarifa_desde AND '2008-10-15' < tarifa_hasta then (DATEDIFF('2008-10-15',tarifa_desde)+1) when '2008-08-25' > tarifa_desde AND '2008-10-15' >= tarifa_hasta then (DATEDIFF(tarifa_hasta,tarifa_desde) - datediff('2008-08-25', tarifa_desde)+1) when '2008-08-25' > tarifa_desde AND '2008-10-15' < tarifa_hasta then (DATEDIFF(tarifa_hasta,tarifa_desde) - DATEDIFF('2008-08-25',tarifa_desde)-datediff(tarifa_hasta,'2008-10-15')+1) end as DIAS, case when '2008-08-25' <= tarifa_desde AND '2008-10-15' >= tarifa_hasta then (DATEDIFF(tarifa_hasta,tarifa_desde)+1) * tarifa_valor_noche when '2008-08-25' <= tarifa_desde AND '2008-10-15' < tarifa_hasta then (DATEDIFF('2008-10-15',tarifa_desde)+1) * tarifa_valor_noche when '2008-08-25' > tarifa_desde AND '2008-10-15' >= tarifa_hasta then (DATEDIFF(tarifa_hasta,tarifa_desde) - datediff('2008-08-25', tarifa_desde)+1) * tarifa_valor_noche when '2008-08-25' > tarifa_desde AND '2008-10-15' < tarifa_hasta then (DATEDIFF(tarifa_hasta,tarifa_desde) - DATEDIFF('2008-08-25',tarifa_desde)-datediff(tarifa_hasta,'2008-10-15')+1)*tarifa_valor_noche end as cantidad
FROM tarifas
WHERE (
'2008-08-25' <= tarifa_desde
AND '2008-10-15' >= tarifa_desde
)
OR (
'2008-08-25' >= tarifa_desde
AND '2008-08-25' <= tarifa_hasta
)

Última edición por jurena; 08/08/2008 a las 03:27
  #13 (permalink)  
Antiguo 08/08/2008, 06:23
NHS
 
Fecha de Ingreso: junio-2002
Ubicación: Todos lados
Mensajes: 92
Antigüedad: 21 años, 10 meses
Puntos: 0
Respuesta: Query con resultado en 2 registros

Jurena

al parecer va bien, voy a seguir probandolo, te aviso

muchas gracias
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 05:26.