Niveau 6 : Travailler le texte et les dates
Mis à jour le
Débutant · niveau 6 sur 20. Objectif : Transformer du texte et extraire des informations des dates.
Notions : UPPER LOWER LENGTH || SUBSTR strftime date julianday
Leçon
SQL sait transformer le texte. UPPER et LOWER mettent un texte en majuscules ou en minuscules, ce qui sert à harmoniser des données mal saisies comme « bob durand » ou « CLAIRE ROUX ». LENGTH donne le nombre de caractères.
SUBSTR(texte, début, longueur) extrait un morceau d'un texte. Le premier caractère est à la position 1, pas 0 : SUBSTR('Paris', 1, 3) donne 'Par'.
L'opérateur || colle des textes bout à bout : name || ' (' || city || ')' donne « Lena (Lyon) ». Attention : si une des valeurs collées est NULL, tout le résultat devient NULL.
Dans SpeedQL (SQLite), une date est un texte au format 'AAAA-MM-JJ'. Ce format a un grand avantage : l'ordre alphabétique est aussi l'ordre chronologique. On compare donc directement des dates : '2025-03-01' < '2025-04-15'.
Pour extraire une partie d'une date, on utilise strftime(format, date). '%Y' donne l'année, '%m' le mois, '%d' le jour, '%Y-%m' l'année et le mois. strftime('%Y', joined) donne par exemple '2022'. Le résultat est un texte : on le compare à '2022', entre apostrophes.
Pour décaler une date, on utilise date(date, décalage) : date('2025-07-01', '+1 day') donne '2025-07-02'. Les décalages s'écrivent '+7 days', '-1 month' ou '+1 year'. strftime accepte les mêmes décalages après la date.
Pour mesurer un écart, julianday(date) convertit une date en nombre de jours. La différence de deux julianday donne donc un écart en jours : julianday(return_date) - julianday(loan_date) donne la durée d'un prêt.
Enfin, CAST(valeur AS type) convertit une valeur d'un type à un autre : CAST(strftime('%Y', joined) AS INTEGER) donne le nombre 2022 au lieu du texte '2022', avec lequel on peut ensuite calculer (une ancienneté, par exemple).
Syntaxe
SELECT UPPER(nom),
nom || ' - ' || ville,
SUBSTR(texte, 1, 4),
strftime('%Y', date_col),
date(date_col, '+7 days')
FROM ma_table;Exemple commenté
SELECT name || ' (' || city || ')' AS label, strftime('%Y', joined) AS join_year
FROM members;On fabrique une étiquette lisible en collant le nom et la ville, et on extrait l'année d'inscription.
| id | name | city | joined |
|---|---|---|---|
| 1 | Lena | Lyon | 2022-01-15 |
| 2 | Marc | Paris | 2021-06-03 |
| 3 | Nadia | Lyon | 2023-03-20 |
| 4 | Oscar | Lille | 2020-11-11 |
| 5 | Paula | Paris | 2024-02-01 |
| 6 | Quentin | Nantes | 2023-09-09 |
Résultat de l’exemple
| label | join_year |
|---|---|
| Lena (Lyon) | 2022 |
| Marc (Paris) | 2021 |
| Nadia (Lyon) | 2023 |
| Oscar (Lille) | 2020 |
| Paula (Paris) | 2024 |
| Quentin (Nantes) | 2023 |
À retenir
- || concatène des textes.
- SUBSTR compte à partir de 1.
- strftime extrait une partie d'une date, julianday permet de calculer des écarts.
Pièges fréquents
- strftime renvoie du texte : on compare avec '2023', entre apostrophes.
- Une date avec heure est « plus grande » que la date seule : '2025-06-05 10:00' > '2025-06-05'. departs BETWEEN '2025-06-01' AND '2025-06-05' oublie donc les vols du 5 juin. Écris departs < '2025-06-06' comme borne de fin.
- Si une des valeurs collées avec || est NULL, tout le résultat devient NULL.
Spécificité SQLite
SQLite n'a pas de vrai type date : une date est un texte au format 'AAAA-MM-JJ', et strftime, date et julianday sont propres à SQLite. Les autres moteurs ont un type DATE et d'autres fonctions (EXTRACT, DATE_TRUNC, DATEDIFF…).
Pour aller plus loin
TRIM(texte) retire les espaces au début et à la fin ; REPLACE(texte, '-', '/') remplace toutes les occurrences ; INSTR(texte, '@') donne la position d'un caractère (0 s'il est absent). Combinées : SUBSTR(email, INSTR(email, '@') + 1) extrait le domaine d'une adresse ('mail.com').
Les 5 exercices du niveau
- Affiche le nom de chaque contact en majuscules (name_upper) et son nombre de caractères (name_length).
- Affiche, pour chaque client de l'hôtel, une colonne guest au format « nom - pays » (par exemple « Ana Silva - Portugal »).
- Affiche la compagnie et l'heure de départ de chaque vol (par exemple 08:10) dans une colonne nommée hour.
- Affiche le nom des membres inscrits en 2023.
- Un prêt dure au maximum 21 jours. Pour les prêts rendus en retard, affiche l'identifiant, la date limite de retour (due_date), la date de retour et le nombre de jours de retard (days_late).
Dans SpeedQL, chaque requête est corrigée tout de suite : le résultat est comparé à celui attendu, puis la requête est relancée sur une base de contrôle cachée. Chaque exercice a ses indices écrits, à afficher seulement si tu bloques.
Voir aussi : la fiche de l’aide-mémoire · les exercices SQL corrigés sur cette notion
Faire les exercices du niveau 6
Gratuit, sans inscription : la leçon et les 5 exercices s’ouvrent directement dans ton navigateur.
← Niveau précédent : Résumer une table : les agrégats · Niveau suivant : Regrouper avec GROUP BY →