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
tabela contém duas colunas:name e birthday_month
. Os meses são dados em nomes, não em números.p>
name | aniversário_mês |
---|---|
Ronan Tisha | NULO |
Dezembro | 2020 |
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 STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
O resultado fica assim:
nome | aniversário_mês |
---|---|
Donna Nell | NULO |
Purdie Casey | janeiro |
Angie Julia | abril |
Narelle Dillan | abril |
Blaze Graeme | Outubro |
Ronan Tisha | NULO |
Dezembro | Outubro |
Discussão:
Para ordenar por mês, crie uma data com este mês. Para fazer isso, use a função STR_TO_DATE(). Se você tiver uma data armazenada como uma string no campo '
Year Month Day
', você pode convertê-lo em uma data usando STR_TO_DATE(date_string, '%Y %M %d')
. Primeiro, você precisa criar uma string usando a função CONCAT(). O ano pode ser qualquer ano que você quiser (por exemplo,
0001
) e o dia pode ser qualquer dia que você quiser (por exemplo, 01
):CONCAT('0001 ', birthday_month, ' 01')
O
CONCAT()
A função combina todos os argumentos em uma string. A string deve estar no 'Year Month Day
' formato, então o segundo argumento deve ser birthday_month
; o primeiro e o terceiro argumentos só precisam estar nos formatos corretos. Então, você precisa converter essa string em uma data usando o
STR_TO_DATE(date_string, '%Y %M %d')
função. O segundo argumento desta função é o formato da data. %Y
significa ano, %M
significa mês (seu nome completo, não um número) e %d
significa dia. STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Use-o com um
ORDER BY
cláusula para classificar as linhas em ordem crescente por data. Se você quiser ver as linhas em ordem decrescente, basta anexar um DESC
palavra-chave, assim:SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Observe que no MySQL,
NULL
s são exibidos primeiro ao classificar em ordem crescente e por último 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
terceiro e Narelle Dillan
quarto, ou Narelle Dillan
terceiro e Angie Julia
quarto).