A cláusula ORDER BY é utilizada para ordenar os dados retornados por uma consulta. Por Exemplo:
SELECT fname, hire_date FROM employee
WHERE fname like ‘P%’
ORDER BY fname
fname hire_date
————— ————————
Palle 1993-05-09 00:00:00.000
Paolo 1992-08-27 00:00:00.000
Patricia 1989-08-01 00:00:00.000
Paul 1993-08-19 00:00:00.000
Paula 1994-01-19 00:00:00.000
Pedro 1990-12-24 00:00:00.000
Peter 1992-05-17 00:00:00.000
Philip 1989-11-11 00:00:00.000
Pirkko 1993-11-29 00:00:00.000
O PROBLEMA:
Não é raro que ao recuperar datas do banco de dados, precisamos ou queremos que a recuperação seja feita em um formato já pronto para exibição. Para tanto, utiliza-se a função CONVERT.
O problema é que a utilização do ORDER BY em consultas com campos do tipo data, onde o campo é convertido para VARCHAR no mesmo SELECT, pode fazer com que os resultados obtidos não sejam os esperados. Por Exemplo:
SELECT fname, CONVERT (varchar,hire_date,103) AS hire_date FROM pubs..employee
WHERE fname LIKE ‘P%’
ORDER BY hire_date
OU
SELECT fname, CONVERT (varchar,hire_date,103) AS Data FROM pubs..employee
WHERE fname LIKE ‘P%’
ORDER BY Data
fname hire_date
——————– ———-
Patricia 01/08/1989
Palle 09/05/1993
Philip 11/11/1989
Peter 17/05/1992
Paula 19/01/1994
Paul 19/08/1993
Pedro 24/12/1990
Paolo 27/08/1992
Pirkko 29/11/1993
Talvez você não note de imediato, mas o ORDER BY irá falhar.
Isso porque o ORDER BY é uma cláusula capaz de reconhecer alias de campos e será uma das últimas cláusulas a serem processadas pelo SQL. No exemplo acima, quando o ORDER BY for processado, o campo já estará convertido para varchar, com isto, a ordenação não estará sendo realizada sobre o campo Data (hire_date), mas sim pelo
alias (hire_date/Data) que neste caso é uma string do tipo varchar. Podemos ver que a ordenação sobre o campo do tipo caracter será bem diferente da ordenação sobre um campo do tipo data.
SOLUÇÃO:
Para solucionar este problema, devemos informar ao SQL Server que a ordenação deve ser feita pelo campo do tipo Data. Para tanto, basta reescrevermos o exemplo anterior conforme o exemplo abaixo:
SELECT fname, CONVERT (varchar,hire_date,103) AS Data FROM pubs..employee
WHERE fname LIKE ‘P%’
ORDER BY hire_date
fname Data
——————– ———-
Patricia 01/08/1989
Philip 11/11/1989
Pedro 24/12/1990
Peter 17/05/1992
Paolo 27/08/1992
Palle 09/05/1993
Paul 19/08/1993
Pirkko 29/11/1993
Paula 19/01/1994
Note que no exemplo acima o alias é diferente do nome do campo e na cláusula ORDER BY informamos aos SQL Server para ordernar não pelo alias mas sim pelo campo da tabela. Com isto, o SQL reconhece que deve ser feita a ordenação pela data e, enfim, conseguimos obter o resultado esperado.
Para saber mais sobre a cláusula ORDER BY, consulte o Books Online do SQL Server.