Usuário com melhor resposta
Validar datas de aniversário para envio de mail

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.
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]
- Editado Junior Galvão - MVPMVP sexta-feira, 9 de fevereiro de 2018 12:30
- Marcado como Resposta Filipe B CastroModerator quarta-feira, 28 de fevereiro de 2018 20:58
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
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 7 de fevereiro de 2018 11:26
-
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]
-
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
-
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]
- Editado Junior Galvão - MVPMVP sexta-feira, 9 de fevereiro de 2018 12:30
- Marcado como Resposta Filipe B CastroModerator quarta-feira, 28 de fevereiro de 2018 20:58