jueves, 30 de junio de 2016

Función Primer y Último Día del Actual Mes

Objetivos: 
•Ver el uso de algunas funciones de fecha en PL/SQL y con ellas crear una(función, trigger, procedimiento...) que cumpla cierto requerimiento .
•Mas que nada, entretenerme un poco.

Hace poco tuve una asignación en la cual tenia que modificar un Schedule Job el cual tenia que ejecutarse por primera ver el día 1(primero) del siguiente mes a una hora especifica y luego tenia que seguir ejecutándose cada mes el día 1(primero) a la misma hora ya establecida.

Para completar la tarea utilize las  funciones que presento a continuación pero con ciertas diferencias:
Nota: No doy muchas explicaciones ya que las funciones que uso están explicadas en publicaciones anteriores.
_____________________________________________________________________________________

CREATE OR REPLACE FUNCTION F_L_DATE(P_DAY IN CHAR)
    RETURN VARCHAR2
AS
    CURSOR C_FIRST IS
        SELECT --'FM' Remueve ciertos espacios que contienen las fechas
            TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE, -1))+1,'FMDAY ','NLS_DATE_LANGUAGE=SPANISH')
            ||TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE, -1))+1,'DD')
        FROM DUAL; --NLS_DATE_LANGUAGE: Especificar el idioma en cual se mostrara la fecha.
     ----
    CURSOR C_LAST IS
        SELECT
            TO_CHAR(LAST_DAY(SYSDATE), 'FMDAY ','NLS_DATE_LANGUAGE=SPANISH')
            ||TO_CHAR(LAST_DAY(SYSDATE), 'DD')
        FROM DUAL;
     ---
    V_FIRST VARCHAR(13);
    V_LAST V_FIRST%TYPE;
BEGIN
    IF UPPER(P_DAY) = 'F' THEN
        OPEN C_FIRST;
        FETCH C_FIRST INTO V_FIRST;
        CLOSE C_FIRST;
        RETURN INITCAP(V_FIRST);
    ELSIF UPPER(P_DAY) = 'L' THEN
        OPEN C_LAST;
        FETCH C_LAST INTO V_LAST;
        CLOSE C_LAST;
        RETURN INITCAP(V_LAST);
    ELSE
        RETURN 'Valid Entries: F= First Day/Primer Día; L= Last Day/Último Día';    
    END IF;
END;
_____________________________________________________________________________________
Usando dicha Función: 
---
SELECT 
    F_L_DATE('K')
FROM DUAL;
-- No se cumple condición alguna por lo cual retorna:
--OUTPUT: Valid Entries: F= First Day/Primer Día; L= Last Day/Último Día
--
SELECT 
    F_L_DATE('F')
FROM DUAL;
-- Se Cumple primer condición del IF por lo cual retorna el primer día del mes actual
--OUTPUT: Domingo 01
--
SELECT 
    F_L_DATE('L')
FROM DUAL;
-- Se Cumple segunda condición del IF por lo cual retorna el último día del mes actual
--OUTPUT: Martes 31
--Nota: tus resultados serian distintos debido a la fecha en cual lo ejecutas.