Ordenando Aniversariantes - SQL Server

07/06/2020

0

SQL

Boa noite!

sou iniciante no mundo da programação, comecei a estudar SQL ontem, e hoje já preciso fazer um SELECT "complicado" para meus conhecimentos.

Tenho um Banco de dados SQL Server com campos: Nome e Data Nascimento.

Preciso ordenar pela Data Nascimento, sendo a ordem da data mais próxima para a data mais distante, a intenção nesse ordenamento é saber os próximos aniversariantes até o próximo ano (tendo como base a data atual), os que já fizeram aniversário serão os primeiros da lista.
Já tentei alguns SELECTs, porém todos ordenam considerando o Ano de nascimento.

Select * from TabelaX ORDER By Aniversario DESC ou ASC
Select * from TabelaX ORDER BY DAY(Aniversario), MONTH(Aniversario)
Select * from TabelaX ORDER By datediff(month,getdate(), Aniversario) ASC ou DESC

Agradeço antecipadamente pela ajuda.
Fabio Gomez

Fabio Gomez

Responder

Posts

08/06/2020

Luiz Santos

Boa noite Fabio
Pode desconsiderar os períodos que já passaram?
Tipo o cara fez aniversário em Março/2020, em teoria só poderia fazer em Março/2021.
Vou presumir que sim...

Faça assim:

Select campo1
     , campo2
	 , campoN
	 , aniversario
	 , year(getdate())*100000+month(aniversario)*100+day(aniversario) as dtref 
  from TabelaX
 Where year(getdate())*100000+month(aniversario)*100+day(aniversario) >= convert(char8), getdate(),112)  
 ORDER By 5 ASC
 
Responder

08/06/2020

Luiz Santos

Só uma observação, na pressa eu coloquei 100000 é na verdade 10000.

Abs
Responder

08/06/2020

Fabio Gomez

Só uma observação, na pressa eu coloquei 100000 é na verdade 10000.

Abs


Fala Luiz,

primeiramente muito obrigado por ter respondido.

Então, preciso mostrar os que já fizeram aniversário, ou seja, eles seriam os primeiros da fila, pois faltariam menos dias para o próximo aniversario.
Responder

09/06/2020

Emerson Nascimento

tente assim:
select
   *
from
   TabelaX
ORDER By
   convert(varchar(5), Aniversario, 110)

Responder

09/06/2020

Fabio Gomez

tente assim:
select
   *
from
   TabelaX
ORDER By
   convert(varchar(5), Aniversario, 110)


Olá Emerson,

obrigado por responder.

Como disse, sou iniciante, não entendi a lógica aplicada nessa situação. O resultado da ordenação não foi o esperado.

Grato.
Responder

09/06/2020

Luiz Santos

Fabio.

Veja o exemplo que fiz.
Se quiser trazer os que já fizeram, troque o sinal de maior por menor.
Se quiser trazer todos, tire o WHERE.


DECLARE
	@ANIVERSARIO TABLE(
		NOME VARCHAR(50),
		ANIVERSARIO DATE
	)

BEGIN

	INSERT INTO @ANIVERSARIO VALUES
		('PESSOA1','1978-08-28'),
		('PESSOA2','1980-03-04'),
		('PESSOA3','1982-01-11'),
		('PESSOA4','1984-06-01'),
		('PESSOA5','1950-12-07')

	SELECT NOME
	     , ANIVERSARIO
		 , YEAR(GETDATE())*10000+MONTH(ANIVERSARIO)*100+DAY(ANIVERSARIO)  AS DTREF
	  FROM @ANIVERSARIO
	WHERE YEAR(GETDATE())*10000+MONTH(ANIVERSARIO)*100+DAY(ANIVERSARIO) > CONVERT(CHAR(8),GETDATE(),112)
	ORDER BY 3

END

Responder

09/06/2020

Fabio Gomez

Fabio.

Veja o exemplo que fiz.
Se quiser trazer os que já fizeram, troque o sinal de maior por menor.
Se quiser trazer todos, tire o WHERE.


DECLARE
	@ANIVERSARIO TABLE(
		NOME VARCHAR(50),
		ANIVERSARIO DATE
	)

BEGIN

	INSERT INTO @ANIVERSARIO VALUES
		('PESSOA1','1978-08-28'),
		('PESSOA2','1980-03-04'),
		('PESSOA3','1982-01-11'),
		('PESSOA4','1984-06-01'),
		('PESSOA5','1950-12-07')

	SELECT NOME
	     , ANIVERSARIO
		 , YEAR(GETDATE())*10000+MONTH(ANIVERSARIO)*100+DAY(ANIVERSARIO)  AS DTREF
	  FROM @ANIVERSARIO
	WHERE YEAR(GETDATE())*10000+MONTH(ANIVERSARIO)*100+DAY(ANIVERSARIO) > CONVERT(CHAR(8),GETDATE(),112)
	ORDER BY 3

END



Luiz,

obrigado pela resposta.

Vou adaptar meu código C# e testar, pois como não estava conseguindo fazer esse processo com SQL, segui pelo C#.

Grato
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar