Dates, heures et intervalles
IntermédiaireBien 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'ouWHERE cree_le::date = ...appliquent une fonction à la colonne : l'index surcree_lene 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é.