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

Comment commander par date dans PostgreSQL ou Oracle

Problème :

Vous souhaitez trier les lignes par date.

Exemple 1 :

L'exam le tableau a deux colonnes, subject et exam_date .

sujet exam_date
Mathématiques 2019-12-19
Anglais 2020-01-08
Sciences 2020-01-05
Santé 2020-01-05
Art NULL

Vous souhaitez trier les lignes par exam_date .

Solution :

SELECT *
FROM exam
ORDER BY exam_date;

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

sujet exam_date
Mathématiques 2019-12-19
Sciences 2020-01-05
Santé 2020-01-05
Anglais 2020-01-08
Art NULL

Discussion :

Utilisez le ORDER BY mot-clé et le nom de la colonne par laquelle vous voulez trier. De cette façon, vous trierez les données dans l'ordre croissant de cette colonne. Vous pouvez également utiliser le ASC mot-clé pour indiquer clairement que l'ordre est croissant (la date la plus ancienne est affichée en premier, la date la plus récente est affichée en dernier, etc.).

SELECT *
FROM exam
ORDER BY exam_date ASC;

Si vous souhaitez voir la date la plus récente en premier et la date la plus ancienne en dernier, vous devez trier par ordre décroissant. Utilisez le DESC mot clé dans ce cas.

SELECT *
FROM exam
ORDER BY exam_date DESC;

Notez que dans PostgreSQL et dans 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. En outre, les lignes avec le même exam_date sont affichés dans un ordre aléatoire (vous pouvez voir Science seconde et Health troisième, ou Santé deuxième et Science troisième).

Exemple 2 :

L'exam table a les colonnes suivantes :subject , exam_year , exam_month , et exam_day . Les mois sont donnés en noms, pas en nombres.

sujet année_examen mois_examen exam_day
Mathématiques 2019 Décembre 19
Anglais 2020 Janvier 8
Sciences 2020 Janvier 5
Santé 2020 Janvier 5
Art NULL NULL NULL

Vous souhaitez trier les lignes par date d'examen.

Solution :

SELECT *
FROM exam
ORDER BY
  exam_year,
  EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')),
  exam_day;

Le résultat ressemble à ceci (les lignes sont triées par ordre croissant de exam_year , exam_month , et exam_date ):

sujet année_examen mois_examen exam_day
Mathématiques 2019 Décembre 19
Santé 2020 Janvier 5
Sciences 2020 Janvier 5
Anglais 2020 Janvier 8
Art NULL NULL NULL

Discussion :

Vous devez ordonner les lignes par trois valeurs :l'année, le mois et le jour, mais pour avoir le bon ordre, vous devez convertir le mois en un nombre ('January ' à 1 , 'February ' à 2 , etc.). Sinon, vous verriez 'December ' avant 'January '. La fonction TO_DATE(exam_month, 'Month') convertit le nom complet du mois 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 renvoyé sous forme de nombre.

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

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

Pour trier les lignes par date, vous devez trier par année, mois et jour (dans cet ordre). Si vous souhaitez voir le dernier examen en premier, vous devrez trier par ordre décroissant. Pour ce faire, vous devez utiliser un DESC mot-clé après chaque colonne dans le ORDER BY clause.

SELECT *
FROM exam
ORDER BY
  exam_year DESC,
  EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')) DESC,
  exam_day DESC;