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