Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/07/2015, 02:50
jevy99
 
Fecha de Ingreso: julio-2015
Ubicación: Madrid
Mensajes: 17
Antigüedad: 8 años, 9 meses
Puntos: 0
Agrupar consulta de fechas por horas

Buenas.

Este es mi primer mensaje en el foro de sql.
Normalmente resuelvo todas mis dudas buscando, pero por más que lo he hecho, tanto aquí como en Google, no encuentro solución a mi problema. Hay consultas similares, pero no lo suficiente como para hallar una solución por mi mismo.

Bien, antes de nada explicaré el contexto:
Tengo una base de datos en MySQL que registra el consumo de cada habitación en un hotel.
En una tabla guardo la fecha y hora en la que una habitación es ocupada y la fecha y hora en la que es desalojada, así como una referencia a la planta en la que está.
Cada vez que un cliente se va tengo que hacer cálculos de cada hora que ha estado, pero sólo tengo acceso al consumo total de la planta, por lo que tengo que dividirlo por el número de estancias ocupadas en el tramo de esa hora.
Es decir, que tengo que hallar y agrupar por hora el número de habitaciones que tengan una fecha de entrada anterior a la hora del cálculo (ya están ocupadas), y una fecha de salida igual a null (todavía no se han ido) o posterior a la hora del cálculo (ya se han ido pero seguían en la hora del cálculo).

Hasta ahora, como no se me ha ocurrido cómo hacerlo, hago una petición a la base de datos por cada hora de cálculo, dentro de un for en PHP, pero no me parece lo más óptimo, ya que se han llegado a hacer hasta 100 iteraciones.
Esta es la consulta que tenía:
Código MySQL:
Ver original
  1. select count(cod_ocup)
  2.     from t_ocupaciones o, t_habitaciones h
  3.     where h.cod_hab = o.cod_hab && substring(h.nombre_hab, 1, 1) = "'.$planta.'"
  4.     && (o.f_out_real is null || o.f_out_real >= "'.$dato->date.'")
  5.     && o.f_in <= "'.$dato->date.'";'
Necesario saber sobre esta consulta:
- El nombre de la habitación está formado por tres caracteres: el número de planta y dos dígitos alfanuméricos. Por eso hago un substring que coje el primer caracter.
- La variable $dato->date guarda una fecha y una hora con el mismo formato que el DATETIME de los campos f_in y f_out_real.

Por ahora funciona pero, como he dicho, no me parece lo más óptimo, de modo que me gustaría saber una forma de sacar el mismo resultado con las mínimas consultas posibles.

Es decir, lo que necesito es conocer el número de estancias ocupadas cada hora desde una fecha+hora concretas hasta otra fecha+hora concretas, que son las de entrada y salida de algún huésped.

Gracias y un saludo.