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

Comment commander par date dans SQLite

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 Date de l'examen
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 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 SQLite, 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 seconde et Health troisième, ou Health 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

Solution :

SELECT *
FROM exam
ORDER BY exam_year,
 (CASE exam_month
    WHEN 'January' THEN 1
    WHEN 'February' THEN 2
    WHEN 'March' THEN 3
    WHEN 'April' THEN 4
    WHEN 'May' THEN 5
    WHEN 'June' THEN 6
    WHEN 'July' THEN 7
    WHEN 'August' THEN 8
    WHEN 'September' THEN 9
    WHEN 'October' THEN 10
    WHEN 'November' THEN 11
    WHEN 'December' THEN 12
  END),
  exam_day;

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

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 les lignes par date d'examen, vous devez d'abord trier par année, puis par mois numérique (et non par nom de mois) et enfin par jour. Vous pouvez convertir les noms de mois en mois numériques avec un CASE WHEN clause. Après le CASE mot-clé, spécifiez le nom de la colonne. Ensuite, après chaque WHEN, indiquez la valeur dans cette colonne, utilisez le mot clé THEN et spécifiez la nouvelle valeur que vous souhaitez attribuer à la place de l'ancienne. Ici, la colonne est exam_month , les valeurs actuelles de cette colonne sont 'January ', 'February ', …, 'December ', et les nouvelles valeurs sont les mois numériques 1 , 2 , …, 12 . Après avoir fini de convertir toutes les valeurs, n'oubliez pas d'utiliser le END mot clé pour fermer le CASE WHEN clause. Jetez un œil :

CASE exam_month
  WHEN 'January' THEN 1
  WHEN 'February' THEN 2
  WHEN 'March' THEN 3
  WHEN 'April' THEN 4
  WHEN 'May' THEN 5
  WHEN 'June' THEN 6
  WHEN 'July' THEN 7
  WHEN 'August' THEN 8
  WHEN 'September' THEN 9
  WHEN 'October' THEN 10
  WHEN 'November' THEN 11
  WHEN 'December' THEN 12
END

C'est ainsi que vous convertissez un nom de mois en un numéro de mois. Vous pouvez l'utiliser pour trier les lignes par date, c'est-à-dire par année, mois numérique et jour.

ORDER BY exam_year,
 (CASE exam_month
    WHEN 'January' THEN 1
    WHEN 'February' THEN 2
    WHEN 'March' THEN 3
    WHEN 'April' THEN 4
    WHEN 'May' THEN 5
    WHEN 'June' THEN 6
    WHEN 'July' THEN 7
    WHEN 'August' THEN 8
    WHEN 'September' THEN 9
    WHEN 'October' THEN 10
    WHEN 'November' THEN 11
    WHEN 'December' THEN 12
  END),
  exam_day

De cette façon, vous pouvez trier les lignes par ordre croissant de date. Le NULL s s'affichera en premier. Pour changer l'ordre en décroissant, utilisez le DESC mot-clé après chaque colonne dans le ORDER BY clause. Voici à quoi devrait ressembler l'ensemble de la requête :

SELECT *
FROM exam
ORDER BY
  exam_year DESC,
  (CASE exam_month
    WHEN 'January' THEN 1
    WHEN 'February' THEN 2
    WHEN 'March' THEN 3
    WHEN 'April' THEN 4
    WHEN 'May' THEN 5
    WHEN 'June' THEN 6
    WHEN 'July' THEN 7
    WHEN 'August' THEN 8
    WHEN 'September' THEN 9
    WHEN 'October' THEN 10
    WHEN 'November' THEN 11
    WHEN 'December' THEN 12
  END) DESC,
  exam_day DESC;

Notez que lors du tri par ordre décroissant dans SQLite, NULL s sont affichés en dernier.