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

Como ordenar por nome de mês no PostgreSQL ou Oracle

Problema:


Você deseja classificar as linhas pelo número do mês, com os nomes dos meses (você deseja que janeiro seja mostrado primeiro, dezembro por último).

Exemplo:


O birthday A tabela contém duas colunas:name e birthday_month . Os meses são dados em nomes, não em números.
nome aniversário_mês
Ronan Tisha NULO
Dezembro janeiro
Angie Julia abril
Narelle Dillan abril
Purdie Casey janeiro
Donna Nell NULO
Blaze Graeme Outubro

Você deseja classificar as linhas por birthday_month .

Solução:

SELECT *
FROM birthday
ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));

O resultado é assim (as linhas são classificadas em ordem crescente por birthday_month ):
nome aniversário_mês
Purdie Casey janeiro
Angie Julia abril
Narelle Dillan abril
Blaze Graeme Outubro
Ronan Tisha janeiro
Dezembro NULO
Donna Nell NULO

Discussão:


Para classificar as linhas por mês começando em janeiro e terminando em dezembro, 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(birthday_month, 'Month') converte um nome de mês completo 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á um número entre 1 e 12 .

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(birthday_month, 'Month'))

Coloque esta expressão após ORDER BY para ordenar as linhas por mês. Se você quiser ver primeiro o mês mais recente, precisará classificar em ordem decrescente. Para fazer isso, você precisa usar um DESC palavra-chave, assim:
SELECT *
FROM birthday
ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;

Observe que no PostgreSQL e 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 birthday_month são exibidos em ordem aleatória (você pode ver Angie Julia segundo e Narelle Dillan terceiro, ou Narelle Dillan segundo e Angie Julia terceiro).