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).