Aller au contenu

Dates & Calendriers

·3 mins·
SQL Formation
SQL - Cet article fait partie d'une série.
Partie 8: Cet article

Travailler avec les dates est incontournable en SQL : extractions d’indicateurs, sĂ©ries temporelles, calculs de durĂ©es, reporting, etc.


📩 Types de champs date
#

Types les plus courants :

Type SQLDescription
DATEDate seule (2024-12-31)
TIMESTAMP / DATETIMEDate + heure (2024-12-31 14:15:00)
TIMEHeure seule (14:15:00)

DuckDB : DATE, TIME, TIMESTAMP, TIMESTAMPTZ PostgreSQL : mĂȘmes types SQLite : pas de vrai type date → stockage texte, parsing manuel


📅 Formatage & parsing
#

  • Conversion texte → date

    SELECT TO_DATE('2024-01-01', 'YYYY-MM-DD') -- PostgreSQL
    
    -- DuckDB : on peut caster directement ou utiliser `STRPTIME` :
    SELECT STRPTIME('2024/01/01', '%Y/%m/%d')
    
  • Formatage date → texte

    SELECT STRFTIME(date, '%Y-%m') AS mois
    

🧼 Calculs sur les dates
#

  • Date du jour

    SELECT CURRENT_DATE;          -- 2025-06-14
    SELECT NOW();                 -- 2025-06-14 15:32:10.123
    
  • Extraire une composante

    -- Méthode universelle :
    SELECT
      EXTRACT(YEAR FROM date_commande) AS annee,
      EXTRACT(MONTH FROM date_commande) AS mois,
      EXTRACT(DOW FROM date_commande) AS jour_semaine
    FROM commandes;
    
    -- Alternatives (DuckDB / PostgreSQL) :
    SELECT
      YEAR(date_commande),
      MONTH(date_commande),
      DAY(date_commande),
      WEEK(date_commande)
    FROM commandes;
    

    DOW = Day Of Week (0 = dimanche sur PostgreSQL)

  • Ajouter / soustraire un intervalle

    -- DuckDB & PostgreSQL 
    SELECT date_commande + INTERVAL '7 days' AS date_plus_7
    FROM commandes;
    
    -- MySQL / SQL Server :
    SELECT DATE_ADD(date_commande, INTERVAL 7 DAY)
    
  • DiffĂ©rence entre deux dates

    -- MySQL / SQL Server :
    SELECT DATEDIFF('2024-01-15', '2024-01-01')
    
    -- DuckDB :
    SELECT DATEDIFF('day', date1, date2)
    
    -- PostgreSQL :
    SELECT date1 - date2         -- interval
    SELECT age(date1, date2)     -- plus lisible
    
  • Troncature

    SELECT DATE_TRUNC('month', date_commande) AS debut_mois
    FROM commandes;
    
    UnitéRésultat typique
    'day'2024-06-14
    'month'2024-06-01
    'week'2024-06-10 (début semaine)
    'year'2024-01-01

đŸ§± GĂ©nĂ©rer un calendrier (calendar table)
#

DuckDB / PostgreSQL :

SELECT
  DATE '2024-01-01' + INTERVAL i DAY AS jour
FROM generate_series(0, 364) AS t(i);

→ CrĂ©e 365 jours continus Ă  partir du 1er janvier 2024.


🧯 Piùges classiques
#

⚠ PiĂšge✅ Solution
Comparer DATE ↔ STRINGCAST('2024-01-01' AS DATE)
Manquer des jours sans donnéesUtiliser une table de dates pour jointure
Formater trop tĂŽt les datesFormater Ă  la fin (TO_CHAR, FORMAT)
Confondre syntaxes entre moteurs SQLVérifier support : INTERVAL, DATEDIFF, DATEADD

đŸ§Ș CompatibilitĂ© entre moteurs SQL (rĂ©cap)
#

ObjectifDuckDB / PostgreSQLMySQL / SQL Server
Ajouter une durée+ INTERVAL 1 MONTHDATEADD(MONTH, 1, ...)
Différence entre 2 datesDATEDIFF('day', a, b)DATEDIFF(a, b)
Extraire une composanteEXTRACT(MONTH FROM date)MONTH(date)
Formater date → stringSTRFTIME(date, '%Y-%m')DATE_FORMAT(date, ...)
Convertir string → dateSTRPTIME / TO_DATESTR_TO_DATE

đŸ‹ïžâ€â™‚ïž Exercices
#

  • Extraire mois + annĂ©e de chaque commande
  • Calculer le nombre de jours depuis l’inscription d’un client
  • GĂ©nĂ©rer un calendrier 2024 + jour de semaine
  • Grouper les commandes par semaine
duckdb.sql("""
SELECT
  client_id,
  date_commande,
  YEAR(date_commande) AS annee,
  MONTH(date_commande) AS mois,
  date_commande + INTERVAL 7 DAY AS livraison_estimee
FROM commandes;
""").df()

📚 Ressources utiles
#


✅ RĂ©cap rapide
#

ObjectifDuckDB / PostgreSQLMySQL / SQL Server
Ajouter une durée+ INTERVAL 1 MONTHDATEADD(MONTH, 1, ...)
Différence entre 2 datesDATEDIFF('day', a, b)DATEDIFF(a, b)
Extraire une composanteEXTRACT(MONTH FROM date)MONTH(date)
Formater date → stringSTRFTIME(date, '%Y-%m')DATE_FORMAT(date, ...)
Générer un début de moisDATE_TRUNC('month', date)DATE_FORMAT(..., '%Y-%m-01')
Convertir string → dateSTRPTIME(...), CAST(...)STR_TO_DATE(...)
Thibault CLEMENT - Intechnia
Auteur
Thibault CLEMENT - Intechnia
Data scientist
SQL - Cet article fait partie d'une série.
Partie 8: Cet article