1. Enorable
  2. Base De Datos
  3. Oracle
1
0
 
vistas: 598
Joswald Oropeza
| 21/09/2019

Función de Oracle para calcular los meses que hay entre dos fechas

Función para Oracle que calcula y retorna el número total de meses que hay entre dos fechas que se pasan como parámetros, controlando una excepción en caso de producirse un error.

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;
/


/* Ejecutar F_MESES */
SELECT F_MESES(TO_DATE('24-DEC-2010'), SYSDATE) meses FROM DUAL;

Todos los titulares en un solo lugar...