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:

Generar proyecto en genexus en modo '-ignoreresume'

Muchas veces, cuando trabajaba con transacciones de GeneXus X, me aparecia un error que me recomendaba usar el modo ignoreresume para poder generar el proyecto. Por más que buscaba, no sabia donde tenia que poner la opción, hasta que de casualidad encontré como hacerlo.

  1. Seleccionar Preferences en las opciones del navegador del Knowledge Base.


  2. Una vez selecionada Preferences hay que navegar hasta encontrar Default (o el generador que utilizes) y hacerle un click.

  3. Una vez aqui, revisar en las propiedades del generador y abrir la opción Build Process y ahi abrir Advanced y agregar al final de Reorganization Options y Create Database Options la opcion -ignoreresume y listo! :D