none
Select para Aniversariantes por periodo - Sql server RRS feed

  • Pergunta

  • Bom dia...

    no meu cadastro de clientes tenho a data de nascimento

    preciso saber quem completa ano entre  duas datas.

    por exemplo: quem completo ano entre 02/04/2015 e 28/07/2015

    der de já agradeço pela atenção...


    sexta-feira, 25 de setembro de 2015 13:41

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
    sexta-feira, 25 de setembro de 2015 19:00

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
    sexta-feira, 25 de setembro de 2015 14:09
  • Deu erro amigo

    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
    sexta-feira, 25 de setembro de 2015 18:00
  • amigo essa tabela so tem 32 cliente e todos estão com datas validade

    fiz da mesmo forma q vc mandou e permaneceu no mesmo erro...

    será o q pode ser?

    sexta-feira, 25 de setembro de 2015 18:15
  • 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).aspx

    Se 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
    sexta-feira, 25 de setembro de 2015 18:22
  • o campo datanasc esta como tipo de documento "DATE" não seria por isso?

    eu mudei para date e funcional o select porem não retornou nada...

    sexta-feira, 25 de setembro de 2015 18:33
  • 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?

    sexta-feira, 25 de setembro de 2015 18:38
  • certo "datanasc" é um campo de data de nascimento! preciso saber qual os cliente que faz aniversario no período '2005-04-02' a '2015-07-28' .

    sexta-feira, 25 de setembro de 2015 18:44
  • 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
    sexta-feira, 25 de setembro de 2015 19:00
  • exatamente isso valeu ai Sammuel pela ajudar :)
    sexta-feira, 25 de setembro de 2015 19:20
  • Sem problema...
    sexta-feira, 25 de setembro de 2015 19:43
  • 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
    

    sexta-feira, 25 de setembro de 2015 20:02