</>
Plan du cours — 14/64

Dates, heures et intervalles

Intermédiaire

Bien manipuler le temps évite une classe entière de bugs (fuseaux, fins de mois, bornes).

SELECT now();                                   -- instant courant (timestamptz)
SELECT current_date;                            -- date du jour
SELECT now() - interval '7 days';               -- il y a 7 jours
SELECT date_trunc('day', now());                -- minuit du jour courant
SELECT extract(dow FROM now());                 -- jour de la semaine (0 = dimanche)
SELECT now() AT TIME ZONE 'Europe/Paris';       -- heure murale à Paris (timestamp sans tz)
SELECT age(now(), date '1990-05-12');           -- intervalle « 36 years 4 mons ... »

Filtrer sur une période : intervalle semi-ouvert#

-- Toutes les commandes de septembre 2026
WHERE cree_le >= timestamptz '2026-09-01'
  AND cree_le <  timestamptz '2026-10-01'

Le style « borne incluse, borne exclue » évite les problèmes de 23:59:59.999 et reste compatible avec un index sur cree_le.

Piège : WHERE date_trunc('day', cree_le) = '2026-09-24' ou WHERE cree_le::date = ... appliquent une fonction à la colonne : l'index sur cree_le ne peut plus servir. Comparez la colonne à des bornes calculées à la place.

Générer une série#

SELECT d::date
FROM   generate_series(date '2026-09-01', date '2026-09-30', interval '1 day') AS d;

Pratique pour produire un calendrier complet puis faire un LEFT JOIN et faire apparaître les jours sans activité.