Ordenando Aniversariantes - SQL Server

SQL

07/06/2020

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

Curtidas 0

Respostas

Luiz Santos

Luiz Santos

07/06/2020

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
 
GOSTEI 0
Luiz Santos

Luiz Santos

07/06/2020

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

Abs
GOSTEI 0
Fabio Gomez

Fabio Gomez

07/06/2020

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.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

07/06/2020

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

GOSTEI 0
Fabio Gomez

Fabio Gomez

07/06/2020

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.
GOSTEI 0
Luiz Santos

Luiz Santos

07/06/2020

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

GOSTEI 0
Fabio Gomez

Fabio Gomez

07/06/2020

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
GOSTEI 0
POSTAR