Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como ordenar por data no PostgreSQL ou Oracle

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;