21/09/2019
Función de Oracle para calcular los meses que hay entre dos fechas

A través de la implementación de un código PL/SQL de Oracle podremos crear de una forma sencilla una función que permita calcular el número de meses que existe como diferencia cuando se comparan dos fechas.
La función ha sido probada en versiones 8i, 9i, 10g y 11g de la base de datos Oracle, su lenguaje de programación procedural y de consultas estructuradas PL/SQL.
El código requiere del uso de funciones propias de Oracle como: TRUNC, MONTHS_BETWEEN, FLOOR y MOD.
La función espera dos parámetros de tipo FECHA, los cuales al contener internamente un formato completo como: DD-MON-YYYY HH24:MI:SS, sus valores se truncan hasta simplificar y evitar la presencia del formato TIEMPO con la intención de solo resolver las fechas. Adicionalmente, MONTHS_BETWEEN y FLOOR permiten conocer el total exacto de los meses que hay entre dichas fechas tras devolver la porción fraccional (por ejemplo: 1.03225806) calculada por la base de datos. Por último, usamos la función MOD para calcular el resto entre el resultado previo y los doce (12) meses del año que nos retornará el valor buscado.
CREATE OR REPLACE FUNCTION F_MESES(p_fecini DATE,p_fecfin DATE)
RETURN NUMBER
IS
/**********************************************************************
* Función: f_meses
* Descripción: Calcula el total de meses entre 2 fechas
* Parámetros: p_fecini Fecha inicial
* p_fecfin Fecha final
* Retorna: v_meses Total de meses
* *****************************************************************
*/
v_meses NUMBER := 0;
BEGIN
SELECT MOD ( FLOOR ( MONTHS_BETWEEN ( TRUNC( p_fecfin ), TRUNC ( p_fecini ) ) ), 12 ) INTO v_meses
FROM DUAL;
RETURN v_meses;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END F_MESES;
/
RETURN NUMBER
IS
/**********************************************************************
* Función: f_meses
* Descripción: Calcula el total de meses entre 2 fechas
* Parámetros: p_fecini Fecha inicial
* p_fecfin Fecha final
* Retorna: v_meses Total de meses
* *****************************************************************
*/
v_meses NUMBER := 0;
BEGIN
SELECT MOD ( FLOOR ( MONTHS_BETWEEN ( TRUNC( p_fecfin ), TRUNC ( p_fecini ) ) ), 12 ) INTO v_meses
FROM DUAL;
RETURN v_meses;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END F_MESES;
/
/* Ejecutar F_MESES */
SELECT F_MESES(TO_DATE('24-DEC-2010'), SYSDATE) meses FROM DUAL;
SELECT F_MESES(TO_DATE('24-DEC-2010'), SYSDATE) meses FROM DUAL;
Nota: Si este recurso te ha servido de ayuda recuerda que puedes apoyar mi trabajo realizando una contribución voluntaria a través de mi perfil de usuario de la página y/o puedes enviar tus comentarios a través del sistema de contacto.
Consulta Lo+ Top de Base De Datos