Problema:
Você deseja classificar as linhas por data.
Exemplo 1:
O
exam
tabela tem duas colunas, subject
e exam_date
. assunto | exam_date |
---|---|
Matemática | 2019-12-19 |
Inglês | 2020-01-08 |
Ciência | 2020-01-05 |
Saúde | 2020-01-05 |
Arte | NULO |
Você deseja classificar as linhas por
exam_date
. Solução:
SELECT * FROM exam ORDER BY exam_date;
O resultado é assim (as linhas são classificadas em ordem crescente por
exam_date
):assunto | exam_date |
---|---|
Matemática | 2019-12-19 |
Ciência | 2020-01-05 |
Saúde | 2020-01-05 |
Inglês | 2020-01-08 |
Arte | NULO |
Discussão:
Use o
ORDER BY
palavra-chave e o nome da coluna pela qual você deseja classificar. Dessa forma, você classificará os dados em ordem crescente por esta coluna. Você também pode usar o ASC
palavra-chave para deixar claro que a ordem é crescente (a data mais antiga é exibida primeiro, a data mais recente é exibida por último etc.). SELECT * FROM exam ORDER BY exam_date ASC;
Se você quiser ver a data mais recente primeiro e a data mais antiga por último, será necessário classificar em ordem decrescente. Use o
DESC
palavra-chave neste caso. SELECT * FROM exam ORDER BY exam_date DESC;
Observe que no PostgreSQL e no Oracle,
NULL
s são exibidos por último ao classificar em ordem crescente e primeiro ao classificar em ordem decrescente. Além disso, as linhas com o mesmo exam_date
são exibidos em ordem aleatória (você pode ver Science
segundo e Health
terceiro, ou Saúde em segundo lugar e Science
terceiro). Exemplo 2:
O
exam
tabela tem as seguintes colunas:subject
, exam_year
, exam_month
e exam_day
. Os meses são dados em nomes, não em números. assunto | exam_year | exam_month | exam_day |
---|---|---|---|
Matemática | 2019 | Dezembro | 19 |
Inglês | 2020 | janeiro | 8 |
Ciência | 2020 | janeiro | 5 |
Saúde | 2020 | janeiro | 5 |
Arte | NULO | NULO | NULO |
Você deseja classificar as linhas pela data do exame.
Solução:
SELECT * FROM exam ORDER BY exam_year, EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')), exam_day;
O resultado é assim (as linhas são classificadas em ordem crescente por
exam_year
, exam_month
e exam_date
):assunto | exam_year | exam_month | exam_day |
---|---|---|---|
Matemática | 2019 | Dezembro | 19 |
Saúde | 2020 | janeiro | 5 |
Ciência | 2020 | janeiro | 5 |
Inglês | 2020 | janeiro | 8 |
Arte | NULO | NULO | NULO |
Discussão:
Você precisa ordenar as linhas por três valores:o ano, o mês e o dia, mas para ter a ordem correta, você precisa converter o mês em um número ('
January
' para 1
, 'February
' para 2
, etc). Caso contrário, você veria 'December
' antes de 'January
'. A função TO_DATE(exam_month, 'Month') converte o nome completo do mês em uma data no '0001-MM-01
' formato. Por exemplo, você obtém '0001-12-01
' para dezembro. Agora você pode usar a função EXTRACT(MONTH FROM date) para extrair o mês desse valor de data. O mês será retornado como um número.
Combinando essas duas funções, você pode obter o mês como um número usando a seguinte fórmula:
EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month'))
Para classificar as linhas por data, você precisa classificar por ano, mês e dia (nesta ordem). Se você quiser ver o exame mais recente primeiro, será necessário classificar em ordem decrescente. Para fazer isso, você precisa usar um
DESC
palavra-chave após cada coluna no ORDER BY
cláusula. SELECT * FROM exam ORDER BY exam_year DESC, EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')) DESC, exam_day DESC;