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