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