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

Comment commander par date dans MySQL

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
Art NULL
Mathématiques 2019-12-19
Sciences 2020-01-05
Santé 2020-01-05
Anglais 2020-01-08

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 première date est affichée en premier, la dernière date 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 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. En outre, les lignes avec le même exam_date sont affichés dans un ordre aléatoire (vous pouvez voir Science troisième et Health quatrième, ou Health troisième et Science quatriè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 STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d');

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
Art NULL NULL NULL
Mathématiques 2019 Décembre 19
Santé 2020 Janvier 5
Sciences 2020 Janvier 5
Anglais 2020 Janvier 8

Discussion :

Pour trier par date, créez des valeurs de date à partir des valeurs d'année, de mois et de jour. 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') . Mais d'abord, vous devez créer une chaîne à l'aide de la fonction CONCAT() :

CONCAT(exam_year, ' ', exam_month, ' ', exam_day)

Le CONCAT() La fonction combine tous les arguments en une seule chaîne. Vous n'avez pas besoin de convertir des nombres en chaînes. Puisque vous souhaitez obtenir une chaîne dans le 'Year Month Day ', les arguments sont exam_year , exam_month , exam_day , et les espaces entre eux.

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 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(exam_year, ' ', exam_month, ' ', exam_day), '%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 exam
ORDER BY STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d') DESC;