Em um forum que participo, SQLSERVER2008, alguém estava com uma dúvida a respeito de como ordenar um campo data pelo mês e dia, ignorando o ano.
Vejamos um exemplo, uma tabela com algumas datas:
Select IDPEDIDO, DATA
FROM _Datas
ORDER BY DATA
Resultado:
1 10/06/2004 00:00:00
2 13/06/2004 00:00:00
3 10/07/2004 00:00:00
4 01/01/2005 00:00:00
5 01/06/2005 00:00:00
6 10/06/2005 00:00:00
7 01/01/2006 00:00:00
8 01/01/2007 00:00:00
9 10/06/2007 00:00:00
O Resultado acima mostra as datas ordenadas por dia, mês e ano. Então como ordenar por Mês e Dia, neste caso é preciso na Cláusula do OrderBy efetuar a conversão da Data para um formato que mostre por Mês, Dia e Ano (mm/dd/yyyy)?
Select IDPEDIDO, DATA
FROM _Datas
ORDER BY CONVERT(Char, DATA, 101)
Resultado:
4 01/01/2005 00:00:00
7 01/01/2006 00:00:00
8 01/01/2007 00:00:00
5 01/06/2005 00:00:00
1 10/06/2004 00:00:00
6 10/06/2005 00:00:00
9 10/06/2007 00:00:00
2 13/06/2004 00:00:00
3 10/07/2004 00:00:00
Observe que são mostrados todos as datas em Ordem de Mês/Dia/Ano. O mesmo não funcionaria com o Convert(Char, DATA, 100) pois neste caso o mês estaria sendo ordenado pelo nome do mês e não o número correspondente.
Para outros formatos vejam:
-- mmm dd aaaa hh:mm
Select CONVERT(Char,GETDATE(),100)
-- mm/dd/aaaa
Select CONVERT(Char,GETDATE(),101)
-- aaaa.mm.dd
Select CONVERT(Char,GETDATE(),102)
-- dd/mm/aaaa
Select CONVERT(Char,GETDATE(),103)
-- mm.dd.aaaa
Select CONVERT(Char,GETDATE(),104)
-- aaaammdd
Select CONVERT(Char,GETDATE(),112)
-- aaaa-mm-ddThh:mm:ss
Select CONVERT(Char,GETDATE(),126)
Mais informações sobre conversão de datas em SQL:
MSDN Library: CAST e CONVERT (Transact-SQL)
MSSQLTips.com: Date/Time Conversions Using SQL Server
SQL Tutorials: SQL CAST and CONVERT
The Code Project: Robyn Page's SQL Server Date/Time Workbench
Jenner Maciejewsky Rocha
MVP Visual Basic