Ordenando Aniversariantes - SQL Server
07/06/2020
0
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
Posts
08/06/2020
Luiz Santos
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
08/06/2020
Luiz Santos
Abs
08/06/2020
Fabio Gomez
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.
09/06/2020
Emerson Nascimento
select * from TabelaX ORDER By convert(varchar(5), Aniversario, 110)
09/06/2020
Fabio Gomez
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.
09/06/2020
Luiz Santos
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
09/06/2020
Fabio Gomez
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
Clique aqui para fazer login e interagir na Comunidade :)