none
Validar datas de aniversário para envio de mail RRS feed

  • Pergunta

  • Pessoal, Preciso de uma ajudinha......

    Tenho uma query de datas de nascimento, onde ela executa nos meses 01,04,07 e 10 de todos anos.

    Sempre foi executada todo dia 01 destes meses, porém agora querem executar todo dia 25.

    Exemplo:

    Antigamente era 01/01 até 31/03 ; 01/04 até 30/06 ; 01/07 até 30/09 e 01/10 até 31/12

    Agora querem executar 26/12 até 25/03 ; 26/03 até 25/06 ; 26/06 até 25/09 e 26/09 até 25/12

    tinha na query um DAY(GETDATE()) mas isso pegava certo agora como faço?

    Obrigado.


    terça-feira, 6 de fevereiro de 2018 17:05

Respostas

  • Gapimex,

    Entendo, mas o Where é uma parte de código que será executada realmente uma vez, mas o Case é desgastante para qualquer query, por isso me chamou a atenção.

    Realmente pode ser um cenário de estudos, pois a condição para o predicado que será identificado e tratado pelo execution plan acaba se tornando grande dependendo do volume de dados.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    sexta-feira, 9 de fevereiro de 2018 12:25

Todas as Respostas

  • filipemmaga,

        Bom, entendi que o dia ficou fixo "26", então passamos sempre o dia "26" (INICIO) e "25" (FIM)... certo?

       

        O mês precisa ser sempre o anterior o da data e o ano também.

    SELECT MONTH(GETDATE())-1
    SELECT YEAR(GETDATE())-1

        Então montei esse select:

    SELECT CONVERT(varchar(2), '26') + '/' + 
           CONVERT(varchar(2), MONTH(DATEADD(M, -1, GETDATE()))) + '/' + 
           CONVERT(varchar(4), YEAR(GETDATE())-1) 'DE',
           CONVERT(varchar(2), '25') + '/' + 
           CONVERT(varchar(2), MONTH(GETDATE())) + '/' + 
           CONVERT(varchar(4), YEAR(GETDATE())) 'ATE'


        Atende o que você precisa?

       ESTA ABAIXO ESTÁ ERRADA!!!

    select convert(varchar(2), '26') + '/' + 
           convert(varchar(2), MONTH('2018/01/01')-1) + '/' + 
           convert(varchar(4), YEAR('2018/01/01')-1) 'DE',
           convert(varchar(2), '25') + '/' + 
           convert(varchar(2), MONTH('2018/01/01')) + '/' + 
           convert(varchar(4), YEAR('2018/01/01')) 'ATE'

    []'s,
    Fabio I.
    • Editado Fabio I terça-feira, 6 de fevereiro de 2018 17:59
    terça-feira, 6 de fevereiro de 2018 17:40
  • Boa tarde,

    filipemmaga, segue uma sugestão de script para calcular o próximo período a partir da data atual, e em seguida um exemplo de como ficaria o filtro na query:

    declare @DataIni date;
    declare @DataFim date;
    declare @AnoIni integer;
    
    set @DataIni = cast(DATEADD(DAY, 26 - DAY(CURRENT_TIMESTAMP), CURRENT_TIMESTAMP) as date);
    if Month(@DataIni) % 3 > 0
        set @DataIni = DATEADD(MONTH, 3 - Month(@DataIni) % 3, @DataIni);
    if @DataIni < CURRENT_TIMESTAMP 
        set @DataIni = DATEADD(MONTH, 3, @DataIni);
    set @DataFim = DATEADD(MONTH, 3, DATEADD(DAY, -1, @DataIni));
    set @AnoIni = year(@DataIni);
    
    select * 
    from Tabela
    where
        case when DATEADD(YEAR, @AnoIni - YEAR(DataNascimento), DataNascimento) < @DataIni
            then DATEADD(YEAR, @AnoIni - YEAR(DataNascimento) + 1, DataNascimento)
            else DATEADD(YEAR, @AnoIni - YEAR(DataNascimento), DataNascimento)
        end between @DataIni and @DataFim

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 6 de fevereiro de 2018 18:35
  • Boa tarde,

    filipemmaga, segue uma sugestão de script para calcular o próximo período a partir da data atual, e em seguida um exemplo de como ficaria o filtro na query:

    declare @DataIni date;
    declare @DataFim date;
    declare @AnoIni integer;
    
    set @DataIni = cast(DATEADD(DAY, 26 - DAY(CURRENT_TIMESTAMP), CURRENT_TIMESTAMP) as date);
    if Month(@DataIni) % 3 > 0
        set @DataIni = DATEADD(MONTH, 3 - Month(@DataIni) % 3, @DataIni);
    if @DataIni < CURRENT_TIMESTAMP 
        set @DataIni = DATEADD(MONTH, 3, @DataIni);
    set @DataFim = DATEADD(MONTH, 3, DATEADD(DAY, -1, @DataIni));
    set @AnoIni = year(@DataIni);
    
    select * 
    from Tabela
    where
        case when DATEADD(YEAR, @AnoIni - YEAR(DataNascimento), DataNascimento) < @DataIni
            then DATEADD(YEAR, @AnoIni - YEAR(DataNascimento) + 1, DataNascimento)
            else DATEADD(YEAR, @AnoIni - YEAR(DataNascimento), DataNascimento)
        end between @DataIni and @DataFim

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    Gapimex,

    Você não acredita que dependendo do volume de dados o uso do Case no Where poderá tornar o processamento pesado!

    Será que se aplicarmos este mesmo código Select em uma CTE e na sequência fazer a execução dela não será mais eficiente?

    O que você acha?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 7 de fevereiro de 2018 11:28
  • Junior, acho que sempre vale o teste mas como o Case está sendo executado apenas uma vez e continuaria sendo utilizado com a CTE, acredito que não teríamos uma diferença de performance.

    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 7 de fevereiro de 2018 16:55
  • Gapimex,

    Entendo, mas o Where é uma parte de código que será executada realmente uma vez, mas o Case é desgastante para qualquer query, por isso me chamou a atenção.

    Realmente pode ser um cenário de estudos, pois a condição para o predicado que será identificado e tratado pelo execution plan acaba se tornando grande dependendo do volume de dados.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    sexta-feira, 9 de fevereiro de 2018 12:25