Check 2 and 10 days before and 2, 5 and 10 after the due date

1

Every month I need to send messages to 10 and 2 day customers and 2, 5 and 10 days days on the Day of Expiration , I have already broken my head and I do not know how to do it:

IF OBJECT_ID('tempdb..#TBcontrato') IS NOT NULL
    DROP TABLE #TBcontrato
go 
create table #TBcontrato(
TBContratoID int null,
TBClienteID  int null,
DiaVencimentoMensalidade int null,
ValorMensalidade decimal(18,2) null
)

insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (342,453, 1, 3444.99)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (123,283, 1, 2000.99)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (655,983, 1, 1500.00)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (335,476, 5, 6780.00)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (552,442, 5, 8990.10)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (655,223, 5, 2340.10)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (255,253, 10, 12340.10)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (633,423, 10, 22340.10)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (455,723, 10, 23540.10)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (265,254, 15, 12340.10)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (673,923, 15, 22340.10)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (955,733, 15, 23540.10)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (755,623, 31, 540.10)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (485,523, 31, 230.10)
insert into #TBContrato (TBContratoID, TBClienteID, DiaVencimentoMensalidade, ValorMensalidade) values (495,739, 31, 250.10)
    
asked by anonymous 22.05.2016 / 22:39

1 answer

2
IF OBJECT_ID('TEMPDB..#TBCONTRATO') IS NOT NULL
    DROP TABLE #TBCONTRATO
GO 

CREATE TABLE #TBCONTRATO
(
    TBCONTRATOID INT NULL,
    TBCLIENTEID  INT NULL,
    DIAVENCIMENTOMENSALIDADE INT NULL,
    VALORMENSALIDADE DECIMAL(18,2) NULL
)

INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (342,453, 1, 3444.99)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (123,283, 1, 2000.99)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (655,983, 1, 1500.00)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (335,476, 5, 6780.00)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (552,442, 5, 8990.10)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (655,223, 5, 2340.10)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (255,253, 10, 12340.10)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (633,423, 10, 22340.10)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (455,723, 10, 23540.10)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (265,254, 15, 12340.10)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (673,923, 15, 22340.10)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (955,733, 15, 23540.10)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (755,623, 31, 540.10)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (485,523, 31, 230.10)
INSERT INTO #TBCONTRATO (TBCONTRATOID, TBCLIENTEID, DIAVENCIMENTOMENSALIDADE, VALORMENSALIDADE) VALUES (495,739, 31, 250.10)

-----------------------------------------------------------------------------

-- SUPONHAMOS QUE SUA DATA DE VEREFICAÇÃO SEJA
DECLARE @DATE DATE = GETDATE(); --<<= VOCE PODE ALTERAR PARA TESTE
DECLARE @LASTDAY DATETIME = DATEADD(DAY, -1, CAST(CAST(YEAR(@DATE) AS VARCHAR) + '/' + CAST(MONTH(@DATE) + 1 AS VARCHAR) + '/01' AS DATE));

-- CRIA TABELA TEMPORARIA
DECLARE @TBTEMP TABLE 
(
    TBCONTRATOID INT NULL,
    TBCLIENTEID  INT NULL,
    VALORMENSALIDADE DECIMAL(18,2) NULL,
    DIA INT NULL,
    VENCIMENTO DATE
)

-----------------------------------------------------------------------------

SET @DATE = DATEADD(MONTH, -1, @DATE);
SET @LASTDAY = DATEADD(DAY, -1, CAST(CAST(YEAR(@DATE) AS VARCHAR) + '/' + CAST(MONTH(@DATE) AS VARCHAR) + '/01' AS DATE));

INSERT @TBTEMP
SELECT 
    TBCONTRATOID,
    TBCLIENTEID,
    VALORMENSALIDADE,
    DIAVENCIMENTOMENSALIDADE,
    DATEADD(DAY, DIAVENCIMENTOMENSALIDADE - 1, CAST(CAST(YEAR(@DATE) AS VARCHAR) + '/' + CAST(MONTH(@DATE) AS VARCHAR) + '/01' AS DATE))  AS VENCIMENTO
FROM 
    #TBCONTRATO

-- AJUSTA AS DATAS PARA O ULTIMO DIA CASO O MES NÃO CONTENHA A DATA 
UPDATE @TBTEMP SET VENCIMENTO = @LASTDAY WHERE DAY(VENCIMENTO) != DIA

-----------------------------------------------------------------------------

SET @DATE = DATEADD(MONTH, 1, @DATE);
SET @LASTDAY = DATEADD(DAY, -1, CAST(CAST(YEAR(@DATE) AS VARCHAR) + '/' + CAST(MONTH(@DATE) + 1 AS VARCHAR) + '/01' AS DATE));

INSERT @TBTEMP
SELECT 
    TBCONTRATOID,
    TBCLIENTEID,
    VALORMENSALIDADE,
    DIAVENCIMENTOMENSALIDADE,
    DATEADD(DAY, DIAVENCIMENTOMENSALIDADE - 1, CAST(CAST(YEAR(@DATE) AS VARCHAR) + '/' + CAST(MONTH(@DATE) AS VARCHAR) + '/01' AS DATE))  AS VENCIMENTO
FROM 
    #TBCONTRATO

-- AJUSTA AS DATAS PARA O ULTIMO DIA CASO O MES NÃO CONTENHA A DATA 
UPDATE @TBTEMP SET VENCIMENTO = @LASTDAY WHERE DAY(VENCIMENTO) != DIA

-----------------------------------------------------------------------------

SET @DATE = DATEADD(MONTH, 1, @DATE);
SET @LASTDAY = DATEADD(DAY, -1, CAST(CAST(YEAR(@DATE) AS VARCHAR) + '/' + CAST(MONTH(@DATE) + 1 AS VARCHAR) + '/01' AS DATE));

INSERT @TBTEMP
SELECT 
    TBCONTRATOID,
    TBCLIENTEID,
    VALORMENSALIDADE,
    DIAVENCIMENTOMENSALIDADE,
    DATEADD(DAY, DIAVENCIMENTOMENSALIDADE - 1, CAST(CAST(YEAR(@DATE) AS VARCHAR) + '/' + CAST(MONTH(@DATE) AS VARCHAR) + '/01' AS DATE))  AS VENCIMENTO
FROM 
    #TBCONTRATO

-- AJUSTA AS DATAS PARA O ULTIMO DIA CASO O MES NÃO CONTENHA A DATA 
UPDATE @TBTEMP SET VENCIMENTO = @LASTDAY WHERE DAY(VENCIMENTO) != DIA

-----------------------------------------------------------------------------

-- AJUSTA A DATA 
SET @DATE = DATEADD(MONTH, -1, @DATE);

-----------------------------------------------------------------------------

-- 10 E 2 DIAS ANTES DO DIA DE VENCIMENTO
SELECT 
    *
FROM 
    @TBTEMP
WHERE 
    @DATE = DATEADD(DAY, -10, VENCIMENTO)  
    OR @DATE = DATEADD(DAY, -2, VENCIMENTO)

-----------------------------------------------------------------------------

-- 2, 5 E 10 DIAS DEPOIS DO DIA DE VENCIMENTO
SELECT 
    *
FROM 
    @TBTEMP
WHERE 
    @DATE = DATEADD(DAY, 2, VENCIMENTO)
    OR @DATE = DATEADD(DAY, 5, VENCIMENTO)
    OR @DATE = DATEADD(DAY, 10, VENCIMENTO)
    
23.05.2016 / 00:44