miércoles, 15 de enero de 2014

Cálculo de diferencia entre dos fechas en Oracle 11g

El WMS que utiliza la empresa para la que trabajo provee -entre muchas otras cosas- la posibilidad de mostrar el tiempo de carga de los camiones que se envían con producto terminado a los clientes a partir del cálculo de la diferencia entre el momento en el que se ingresan el primer y último pallet en los mismos. Sin embargo, muestra este dato en un formato decimal en vez de hh:mm (que es más "amigable" y entendible a primera vista).

Por ejemplo:

2.0representa2:00
1.51:30
1.21:12

El proceso de modificación se llevó a cabo en dos partes: 1) Convertir la diferencia de fechas al formato hh:mi, y 2) Asegurar que la los minutos representados por un dígito (1 a 9) se muestren con un cero al principio (01...09).

CONVERTIR LA DIFERENCIA DE FECHAS AL FORMATO HH24:MI

Voy a llamar a la fecha inicial como start_date y a la fecha final como end_date, ambas en el formato DD-MON-YY HH24:MI.

Como punto de partida, es importante tener en cuenta que al realizar la diferencia entre dos fechas en Oracle 11g,


el resultado entregado es el equivalente en días:


En primer lugar multiplicamos la diferencia por 24 para obtener el número de horas correspondiente


(también redondeamos a dos dígitos decimales el resultado):

Ahora separamos la parte entera del resultado anterior como horas y a los dos dígitos decimales los convertimos a su equivalente en minutos:



Podemos ir un paso más allá y solamente tomar la parte entera de la última columna (ya que representa un grado de precisión suficiente) para luego convertir el nuevo resultado a formato de minutos (anteponiendo un cero en el caso de que el número de minutos esté entre 1 y 9).

ASEGURAR QUE LA CANTIDAD DE MINUTOS SE MUESTRE EN EL FORMATO mi


Se utiliza el modelo 'mi' de las funciones TO_DATE y TO_CHAR para representar una cantidad entera comprendida entre 0 y 59 como minutos. Cabe aclarar que si el número en cuestión está fuera de ese rango, cualquiera de las funciones arrojará un error.
La parte entera de las horas se concatena con el equivalente de la parte decimal en minutos mediante el operador "||" utilizando como separador los dos puntos ":".

Documentación de las funciones utilizadas: