Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment commander par nom de mois dans MySQL

Problème :

Vous souhaitez trier les lignes par numéro de mois, en fonction des noms de mois (vous souhaitez que janvier s'affiche en premier, décembre en dernier).

Exemple :

Le birthday le tableau contient deux colonnes :nom et birthday_month . Les mois sont donnés en noms, pas en chiffres.p>

nom anniversaire_mois
Ronan Tisha NULL
Décembre 2020
Angie Julia Avril
Narelle Dillan Avril
Purdie Casey Janvier
Donna Nell NULL
Blaze Graeme Octobre

Vous souhaitez trier les lignes par birthday_month .

Solution :

SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');

Le résultat ressemble à ceci :

nom anniversaire_mois
Donna Nell NULL
Purdie Casey Janvier
Angie Julia Avril
Narelle Dillan Avril
Blaze Graeme Octobre
Ronan Tisha NULL
Décembre Octobre

Discussion :

Pour commander par mois, créez une date avec ce mois. Pour ce faire, utilisez la fonction STR_TO_DATE(). Si vous avez une date stockée sous forme de chaîne dans le champ 'Year Month Day ', vous pouvez le convertir en une date en utilisant STR_TO_DATE(date_string, '%Y %M %d') .

Tout d'abord, vous devez créer une chaîne à l'aide de la fonction CONCAT(). L'année peut être n'importe quelle année de votre choix (par exemple, 0001 ) et le jour peut être n'importe quel jour de votre choix (par exemple, 01 ):

CONCAT('0001 ', birthday_month, ' 01')

Le CONCAT() La fonction combine tous les arguments en une seule chaîne. La chaîne doit être au format 'Year Month Day ', donc le deuxième argument doit être birthday_month; le premier et le troisième arguments doivent simplement être dans les bons formats.

Ensuite, vous devez convertir cette chaîne en une date en utilisant le STR_TO_DATE(date_string, '%Y %M %d') une fonction. Le deuxième argument de cette fonction est le format de la date. %Y représente l'année, %M représente le mois (son nom complet, pas un nombre), et %d signifie jour.

STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')

Utilisez-le avec un ORDER BY clause pour trier les lignes par ordre croissant de date. Si vous souhaitez voir les lignes dans l'ordre décroissant, ajoutez simplement un DESC mot-clé, comme ceci :

SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;

Notez que dans MySQL, NULL s sont affichés en premier lors d'un tri par ordre croissant et en dernier lors d'un tri par ordre décroissant. Aussi, les lignes avec le même birthday_month sont affichés dans un ordre aléatoire (vous pouvez voir Angie Julia troisième et Narelle Dillan quatrième, ou Narelle Dillan troisième et Angie Julia quatrième).