Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como ordenar por nome de mês no MySQL

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