Question 1Lequel des avantages suivants est correct quand on stocke les dates en chaînes ISO comme '2024-03-15' ?
Types date/heure et tables STRICT
Sur la table perf_sales de 50 000 lignes, apprends les trois formats de stockage des dates (chaînes ISO, julianday, unixepoch), l'agrégation par année et par plage avec date() / strftime(), et comment la table typed_strict rejette les incompatibilités de types — le tout en direct dans le navigateur.
Les données qu'on utilise — perf_sales
Les dates sont stockées soit en chaînes, soit en nombres, et tu les lis ou les calcules avec des fonctions comme date() / strftime().
Dans la première moitié, tu utiliseras la colonne sale_date de la table de ventes perf_sales pour vérifier les trois formats de stockage et comment extraire des valeurs ; dans la seconde moitié, tu créeras toi-même une table STRICT pour voir ce qui se passe quand tu insères une valeur qui ne correspond pas au type déclaré.
Les trois formats de stockage des dates — chaîne ISO / julianday / unixepoch
Les dates et heures peuvent être stockées dans trois formats principaux.
| Format | Valeur d'exemple | Usage principal |
|---|---|---|
| Chaîne ISO | '2024-03-15' (avec heure : '2024-03-15 12:30:00') | Lisible par l'humain ; le tri et la comparaison par plage fonctionnent correctement en simple comparaison de chaînes (le choix le plus courant) |
| julianday | julianday('2024-03-15') → 2460384.5 (un décimal comptant les jours depuis l'antiquité) | Calculer la différence entre deux dates en jours |
| unixepoch | strftime('%s', ...) → 1710460800 (secondes entières depuis 1970-01-01) | Calcul de temps à la seconde / interopérabilité entre systèmes |
Quel que soit le format que tu stockes, tu peux le relire en 'YYYY-MM-DD' avec date() ou en 'YYYY-MM-DD HH:MM:SS' avec datetime().
Ce cours utilise la chaîne ISO par défaut parce qu'elle est lisible par l'humain et facile à comparer, et ne convertit en julianday / unixepoch qu'au besoin.
-- La même date dans 3 formats (exemple en lecture seule)
SELECT '2024-03-15' AS iso_text,
julianday('2024-03-15') AS as_julianday,
strftime('%s','2024-03-15 00:00:00') AS as_unixepoch;
-- Reconvertir chacun des 3 formats en date lisible
SELECT date(julianday('2024-03-15')) AS from_jd,
datetime(1710460800,'unixepoch') AS from_unix,
date('2024-03-15') AS from_iso;
-- Avec les chaînes ISO, la comparaison par plage fonctionne correctement en simple comparaison de chaînes
SELECT '2024-03-15' BETWEEN '2024-01-01' AND '2024-12-31' AS in_2024; -- 1
Manipuler et agréger les dates avec date() et strftime()
date(valeur, modificateur...): renvoie la partie date en'YYYY-MM-DD', et te laisse faire de l'arithmétique de dates avec des modificateurs comme'+1 month'/'-7 days'/'start of month'strftime(format, valeur): extrait un morceau de la date sous forme de chaîne en utilisant des spécificateurs de format comme%Y(année),%m(mois),%d(jour),%w(jour de la semaine)- Combine
strftime('%Y', sale_date)avecGROUP BYpour agréger par année - Comme
sale_dateest stockée en chaîne ISO, les conditions de plage comme `WHERE sale_date >= '2024-01-01'` fonctionnent correctement en simple comparaison de chaînes
-- Manipulation de dates (exemple en lecture seule)
SELECT date('2024-03-15','+1 month') AS plus_1_month, -- 2024-04-15
date('2024-03-15','start of month') AS month_start, -- 2024-03-01
strftime('%Y', '2024-03-15') AS year_part, -- 2024
strftime('%Y-%m','2024-03-15') AS year_month; -- 2024-03
-- Compter par année (chaîne ISO, donc extraire l'année avec strftime et GROUP BY)
SELECT strftime('%Y', sale_date) AS yr, COUNT(*) AS cnt
FROM perf_sales
GROUP BY yr
ORDER BY yr;
Tables STRICT — appliquer un typage strict
L'affinité de type qu'on a vue jusqu'ici convertit avec souplesse les chaînes qui ressemblent à des nombres.
À l'inverse, quand tu ajoutes STRICT à la fin d'une définition de table, cette table refuse de stocker des valeurs dont le type ne correspond pas à celui déclaré.
Si tu essaies d'insérer une chaîne non numérique dans une colonne numérique, la valeur n'est pas convertie implicitement — tu obtiens une erreur.
Utilise ça pour les tables où tu veux attraper tôt les confusions de types.
Dans une table STRICT, les types de colonnes autorisés sont limités à INTEGER / REAL / TEXT / BLOB / ANY — INT et les noms de types personnalisés ne sont pas autorisés.
Dans l'exercice suivant tu créeras toi-même une table typed_strict avec STRICT, et dans les exercices qui suivent tu insèreras des valeurs qui correspondent et qui ne correspondent pas pour voir la différence.
-- Déclaration et usage d'une table STRICT (exemple en lecture seule)
CREATE TABLE IF NOT EXISTS typed_strict(a INTEGER, b TEXT, c REAL) STRICT;
-- Les lignes avec des types qui correspondent s'insèrent sans souci
INSERT INTO typed_strict VALUES (1, '2024-03-15', 1.5);
-- Insérer une chaîne non numérique dans la colonne a INTEGER
-- n'est pas converti implicitement -- l'INSERT lève une erreur :
-- cannot store TEXT value in INTEGER column typed_strict.a
INSERT INTO typed_strict VALUES ('not-a-number', 'x', 1.0);
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Lequel des éléments suivants décrit correctement le rôle de strftime('%Y', sale_date) ?
Question 3Lequel des éléments suivants décrit correctement ce qui se passe quand tu essaies d'INSÉRER une chaîne non numérique dans une colonne INTEGER d'une table STRICT ?