Usuário com melhor resposta
Select para Aniversariantes por periodo - Sql server

Pergunta
-
Respostas
-
Ok, nessa seleção então o Ano se tornou irrelevante (já que acredito que você escreveu 2005 por engano acima).
O que importa mesmo é o Mês e o Dia (porque você está excluindo o dia 1/4 e 29 a 31 do 7 eu não sei... mas sem problemas...).
Tente:
DECLARE @dataDe AS DATE = '2015-04-02'; DECLARE @dataAte AS DATE = '2015-07-28'; SELECT * FROM tabcli WHERE (MONTH(datanasc) >= MONTH(@dataDe) AND DAY(datanasc) >= DAY(@dataDe)) AND (MONTH(datanasc) <= MONTH(@dataDe) AND DAY(datanasc) <= DAY(@dataDe))
Deve funcionar
- Sugerido como Resposta SammuelMiranda sexta-feira, 25 de setembro de 2015 19:13
- Marcado como Resposta Rhael_Andrade sexta-feira, 25 de setembro de 2015 19:19
Todas as Respostas
-
DECLARE @dataDe AS DATETIME = '2015-04-02' ,@dataAte AS DATETIME = '2015-07-28' SELECT * FROM Cliente WHERE CONVERT(VARCHAR(10), dataNascimento, 120) BETWEEN @dataDe AND @dataATE;
- Editado ERIC BAUMBACH sexta-feira, 25 de setembro de 2015 14:20
- Marcado como Resposta Rhael_Andrade sexta-feira, 25 de setembro de 2015 17:18
- Não Marcado como Resposta Rhael_Andrade sexta-feira, 25 de setembro de 2015 17:19
-
-
O erro, Rhael_Andrade, então não é do SELECT, mas alguma linha na tabela "tabcli", coluna "datanasc" não é de fato uma data (já que a coluna é VARCHAR(10) ela pode contar letras por exemplo) ou então alguma linha, na coluna "datanasc" está como NULL.
NULL não converte para DATETIME de um valor VARCHAR.
O caso do NULL, podemos alterar o SELECT para:
DECLARE @dataDe AS DATETIME = '2015-04-02' ,@dataAte AS DATETIME = '2015-07-28' SELECT * FROM tabcli WHERE (datanasc IS NOT NULL) AND (CONVERT(VARCHAR(10), datanasc, 120) BETWEEN @dataDe AND @dataATE);
Fora isso, esse erro só se houver algum text invalido, já que a coluna é VARCHAR - como disse no início.
- Editado SammuelMiranda sexta-feira, 25 de setembro de 2015 18:02 Sql
-
-
tente o argumento Style do convert como 113 ou 114 ao invés de 120.
veja aqui https://msdn.microsoft.com/pt-br/library/ms187928(v=sql.120).aspxSe não der digita um valor de uma das linhas, em VARCHAR como aparece para eu ver.
- Editado SammuelMiranda sexta-feira, 25 de setembro de 2015 18:25 Mais alterativas e Link
-
-
Ok, então se você fizer isso:
DECLARE @dataDe AS DATE = '2015-04-02'; DECLARE @dataAte AS DATE = '2015-07-28'; SELECT * FROM tabcli WHERE (datanasc IS NOT NULL) AND (datanasc BETWEEN @dataDe AND @dataATE);
Ainda volta nada? E outra, o campo se chama "datanasc" o que me parece que é de data de nascimento certo? Os parâmetros de busca são entre Abril e Julho de 2015?! Esse ano?
-
-
Ok, nessa seleção então o Ano se tornou irrelevante (já que acredito que você escreveu 2005 por engano acima).
O que importa mesmo é o Mês e o Dia (porque você está excluindo o dia 1/4 e 29 a 31 do 7 eu não sei... mas sem problemas...).
Tente:
DECLARE @dataDe AS DATE = '2015-04-02'; DECLARE @dataAte AS DATE = '2015-07-28'; SELECT * FROM tabcli WHERE (MONTH(datanasc) >= MONTH(@dataDe) AND DAY(datanasc) >= DAY(@dataDe)) AND (MONTH(datanasc) <= MONTH(@dataDe) AND DAY(datanasc) <= DAY(@dataDe))
Deve funcionar
- Sugerido como Resposta SammuelMiranda sexta-feira, 25 de setembro de 2015 19:13
- Marcado como Resposta Rhael_Andrade sexta-feira, 25 de setembro de 2015 19:19
-
-
-
Olá, tenho uma Stored Procedure para fazer isso.
Veja se resolve seu problema:
Obs.: Esta Procedure retorna tambem a idade que o cliente completou. Veja tambem que para este tipo de pesquisa, você tem que desconsiderar o ano e pegar somente o dia e o mes para verificar quem faz aniversario entre estas duas datas.
CREATE PROCEDURE SP_ANIVERSARIANTES @DAT_INI DATETIME, @DAT_FIN DATETIME AS DECLARE @MES INT DECLARE @DIA INT DECLARE @DATA DATETIME DECLARE @TODOS TABLE ( Nome_Razao VARCHAR(100), CPF_CNPJ VARCHAR(14), Email VARCHAR(50), DIA_ANIV INT, MES_ANIV INT, IDADE INT, TELEFONE VARCHAR(25), Ultima_Alteracao DATETIME, Limite_Credito decimal(18,2), Status VARCHAR(1) ) BEGIN SET @DATA = @DAT_INI WHILE ( @DATA < @DAT_FIN ) BEGIN INSERT @TODOS SELECT C.Nome_Razao, C.CPF_CNPJ, C.Email, DAY(C.Data_Nasc_Fundacao), MONTH(C.Data_Nasc_Fundacao), DATEDIFF(YEAR, C.Data_Nasc_Fundacao , GETDATE() ), T.Numero_Telefone, C.Ultima_Alteracao, C.Limite_Credito, C.Status from Contatos C LEFT JOIN Telefones_Contatos T ON T.Chave_Contato = C.Chave AND T.Padrao_NFe = 1 where month(Data_Nasc_Fundacao) = month(@DATA) and day(Data_Nasc_Fundacao) = day(@DATA) order by Data_Nasc_Fundacao; SET @DATA = DATEADD(DAY,1,@DATA) END SELECT T.Nome_Razao, T.CPF_CNPJ, T.Email, T.DIA_ANIV, T.MES_ANIV, T.IDADE, T.TELEFONE, T.Ultima_Alteracao, T.Limite_Credito, T.Status FROM @TODOS T ORDER BY 4,5; END