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