lunes, 18 de julio de 2011

Obtener la cantidad de horas entre dos fechas en mysql

En un trabajo de la universidad hace poco, tuve que calcular el costo del arriendo de un espacio de un condominio (como una cancha o un club house) a partir de la cantidad de horas que duró el arriendo y el costo por hora fijado para ese espacio.
Todo esto se puede resumir en el siguiente modelo de datos:


La idea es hacer un select para obtener por cada arriendo que persona lo arrendo, la fecha de inicio del arriendo, la fecha de termino del arriendo, el precio por hora, la cantidad de horas que hay entre el inicio del arriendo y la de fin y finalmente, el total a pagar.

El problema es que es necesario calcular la cantidad de horas que hay entre las fechas de inicio y termino para poder calcular el precio final que tendra el arriendo.
Para esto, se puede utilizar las funciones TIMEDIFF y EXTRACT incluidas en mysql.
Con la funcion TIMEDIFF se obtiene la diferencia calculada en horas entre dos fechas. Esto es bueno, pero también malo para lo que queria realizar, ya que TIMEDIFF retorna en formato de hora (ejemplo: hh:mm:ss).
Aqui es donde entra en acción la función EXTRACT. Esta función permite extraer el año, el mes, el día, la hora, minutos o segundos de un valor en formato DATETIME.

Entonces, hay que extraer la parte hora de la diferencia entre la fecha de inicio y termino.
La sentencia sería la siguiente:

SELECT ae.idArriendoEspacio as 'id arriendo', p.rut as rut, p.nombre as nombre, p.apellido as apellido, e.descripcion as descripcion, ae.fecha_inicio as inicio, ae.fecha_termino as termino, e.precio_hora as precio, EXTRACT(hour from TIMEDIFF(ae.fecha_termino, ae.fecha_inicio)) as horas, EXTRACT(hour from TIMEDIFF(ae.fecha_termino, ae.fecha_inicio)) * e.precio_hora as 'monto total' 
FROM ArriendosEspacio ae, personas p, espacios e
WHERE ae.idpersona = p.idpersona and ae.idespacio = e.idespacio;

Como resultado obtenemos algo asi:


Se puede observar que por cada arriendo se calcula las cantidades de horas y el monto total a pagar.

Links:

1 comentario: