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

Comment commander par nom de mois dans PostgreSQL ou Oracle

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

nom anniversaire_mois
Ronan Tisha NULL
Décembre Janvier
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 EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));

Le résultat ressemble à ceci (les lignes sont triées par ordre croissant de birthday_month ):

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

Discussion :

Pour trier les lignes par mois à partir de janvier et se terminant par décembre, vous devez convertir le mois en nombre ('January ' au 1, 'February ' à 2 , etc.). Sinon, vous verriez 'December ' avant 'January '. La fonction TO_DATE(birthday_month, 'Month') convertit un nom de mois complet en une date dans le '0001-MM-01 '. Par exemple, vous obtenez '0001-12-01 ' pour décembre.

Vous pouvez maintenant utiliser la fonction EXTRACT(MONTH FROM date) pour extraire le mois de cette valeur de date. Le mois sera un nombre entre 1 et 12 .

En combinant ces deux fonctions, vous pouvez obtenir le mois sous forme de nombre en utilisant la formule suivante :

EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'))

Placez cette expression après ORDER BY pour trier les lignes par mois. Si vous souhaitez voir le dernier mois en premier, vous devrez trier par ordre décroissant. Pour ce faire, vous devez utiliser un DESC mot-clé, comme ceci :

SELECT *
FROM birthday
ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;

Notez que dans PostgreSQL et Oracle, NULL s sont affichés en dernier lors d'un tri par ordre croissant et en premier 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 deuxième et Narelle Dillan troisième, ou Narelle Dillan deuxième et Angie Julia troisième).