fjtello / SQL-C-sharp

Common programming and coding tips and howtos
0 stars 0 forks source link

SQL ejecucion de sp primer día de mes #29

Open fjtello opened 6 years ago

fjtello commented 6 years ago

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ==================================== -- Creación: 2017-Octubre -- Descripción: Invoca un procedimiento el primer día laborable de cada mes. -- Este sp se ejecuta todos los días pero acaba invocando sólo al sp una vez al mes. -- ====================================

CREATE PROCEDURE Ejecucion_primer_día_de_mes

AS BEGIN

SET NOCOUNT ON;

DECLARE @hoy AS DATE; -- fecha base de la referencia

DECLARE @haceUnMes AS DATE;
DECLARE @diaA AS INT; 
DECLARE @mesA AS INT; 
DECLARE @anoA AS INT; 

DECLARE @primerDiaMesPasado AS DATE; 
DECLARE @primerDiaLaborableEsteMes AS DATE; 
DECLARE @esLaborable AS TINYINT;

DECLARE @fechaHoraEjecucion AS DATETIME;
SET @fechaHoraEjecucion = GETDATE();

SET @hoy = GETDATE(); -- Se deja a una variable por si en el futuro se quiere cambiar la fecha base de referencia

-- Calcular el Primer Dia Laborable de este Mes 
SET @mesA = DATEPART(MONTH, @hoy);
SET @anoA = DATEPART(YEAR, @hoy);
SET @primerDiaLaborableEsteMes = CONVERT(DATE, CONVERT(VARCHAR(4), @anoA) + '-' + CONVERT(VARCHAR(4), @mesA) + '-01');

-- Es fin de semana o festivo?
SET @esLaborable = 0;
WHILE(@esLaborable = 0)
BEGIN
    SET @esLaborable = 1;

    IF (DATEPART(WEEKDAY, @primerDiaLaborableEsteMes) IN (1, 7)) SET @esLaborable = 0;

    SET @mesA = DATEPART(MONTH, @primerDiaLaborableEsteMes);
    SET @diaA = DATEPART(DAY, @primerDiaLaborableEsteMes);
    IF(RIGHT('0' + CONVERT(VARCHAR(2), @mesA), 2) + '' + RIGHT('0' + CONVERT(VARCHAR(2), @diaA), 2) IN ('0101','0501','0502', '1101') ) SET @esLaborable = 0;

    IF(@esLaborable = 0)
        SET @primerDiaLaborableEsteMes = DATEADD(DAY, 1, @primerDiaLaborableEsteMes);
END

IF(@primerDiaLaborableEsteMes = @hoy)
    BEGIN
        -- Calcular el Primer Dia del Mes Pasado
        SET @haceUnMes = DATEADD(MONTH, -1, @hoy);
        SET @mesA = DATEPART(MONTH, @haceUnMes);
        SET @anoA = DATEPART(YEAR, @haceUnMes);
        SET @primerDiaMesPasado = CONVERT(DATE, CONVERT(VARCHAR(4), @anoA) + '-' + CONVERT(VARCHAR(4), @mesA) + '-01');

        -- ==============
        EXEC LaMadreDelCordero
        -- ==============
    END
ELSE
    BEGIN

        PRINT 'Hoy no toca'

    END

END GO