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
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
END GO