SQL Academy · Leçon

Fuseaux horaires : TIMESTAMP contre TIMESTAMPTZ

Comprenez la différence entre TIMESTAMP et TIMESTAMPTZ, effectuez des conversions avec AT TIME ZONE et stockez les dates en UTC pour des applications portables.

Leçon 3 sur 413 étapes

Fuseaux horaires : TIMESTAMP contre TIMESTAMPTZ est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.

Deux types de TIMESTAMP

PostgreSQL propose TWO types de TIMESTAMP :

  • TIMESTAMP — horodatage « naïf », sans information de fuseau
  • TIMESTAMPTZ — horodatage avec fuseau horaire (stocké en interne au format UTC)

Règle générale : préférez TIMESTAMPTZ pour les événements ; utilisez TIMESTAMP pour les heures purement abstraites, comme « 9:00 AM, horaires d'ouverture ».

Fonctionnement de TIMESTAMPTZ

Il est toujours stocké en interne au format UTC. Lors d'un INSERT, votre valeur d'entrée est convertie du fuseau TZ de la session vers l'UTC. Lors d'un SELECT, la valeur renvoyée est reconvertie dans le fuseau TZ de la session.

SET TIME ZONE 'Europe/Berlin';
INSERT INTO events (ts) VALUES ('2024-03-15 12:00:00');
-- stored as 2024-03-15 11:00:00 UTC (Berlin is UTC+1 in winter)

SET TIME ZONE 'UTC';
SELECT ts FROM events;
-- 2024-03-15 11:00:00+00

TIMESTAMP perd des informations

Un TIMESTAMP simple ne connaît pas le fuseau. « 2024-03-15 12:00:00 » peut désigner n'importe quelle heure locale. Lorsque les utilisateurs changent de fuseau, la signification est perdue.

AT TIME ZONE

Convertir entre les fuseaux pour l'affichage :

SELECT ts AT TIME ZONE 'America/New_York' AS ny_time FROM events;
SELECT ts AT TIME ZONE 'Asia/Tokyo'        AS tokyo_time FROM events;

Stocker en UTC et afficher en heure locale

Bonne pratique : stockez un TIMESTAMPTZ, convertissez-le dans le fuseau de l'utilisateur lors du SELECT, et ne faites jamais l'inverse.

SELECT id,
       ts AT TIME ZONE COALESCE(u.tz, 'UTC') AS local_ts
FROM events e
JOIN users u ON u.id = e.user_id;

Fuseau horaire de SESSION

Vous pouvez le définir par session, par utilisateur ou globalement :

-- Session:
SET TIME ZONE 'Europe/Berlin';

-- Per-user (PG):
ALTER ROLE alice SET timezone TO 'Europe/Berlin';

-- Server default in postgresql.conf:
-- timezone = 'UTC'

SUPPLY ZONE WITH LITERAL

Intégrez un fuseau dans la valeur littérale :

SELECT TIMESTAMPTZ '2024-03-15 12:00:00 Europe/Berlin';
SELECT '2024-03-15 12:00:00+02'::TIMESTAMPTZ;

NOW() renvoie TIMESTAMPTZ

NOW() et CURRENT_TIMESTAMP renvoient toujours un TIMESTAMPTZ. Les mélanger avec des colonnes TIMESTAMP est une erreur courante.

Quand utiliser TIMESTAMP (sans fuseau)

Pour les heures abstraites ou locales qui ne dépendent véritablement pas d'un fuseau — « le magasin ouvre à 09:00 » — utilisez TIMESTAMP (ou TIME).

CREATE TABLE store_hours (
  store_id BIGINT,
  open_at  TIME NOT NULL,
  close_at TIME NOT NULL
);

Transitions liées à l'heure d'été

TIMESTAMPTZ gère automatiquement le passage à l'heure d'été. L'ajout d'un INTERVAL fonctionne en heures de l'horloge civile, sauf si vous franchissez la transition saisonnière — vous pouvez alors décaler l'heure de 23 ou de 25 heures.

SELECT TIMESTAMPTZ '2024-03-30 23:00:00 Europe/Berlin' + INTERVAL '5 hours';
-- Result accounts for the DST transition on March 31

Ne stockez pas les décalages, stockez les noms de fuseau

Un décalage comme +02:00 ne vous indique pas quand l'heure d'été commence. Un nom de fuseau comme Europe/Berlin le permet. Lorsque vous stockez le fuseau de résidence d'un utilisateur, stockez le nom IANA.

Récapitulatif

Par défaut, utilisez TIMESTAMPTZ pour les événements.

  • Stocké au format UTC, affiché dans le fuseau TZ de la session
  • Convertir pour l'affichage avec AT TIME ZONE
  • Utiliser TIMESTAMP (sans fuseau) uniquement pour les heures locales abstraites

Vérification rapide

Vous développez un service SaaS mondial qui enregistre les événements des utilisateurs. Quel type d'horodatage devez-vous utiliser pour la colonne occurred_at ?

Gratuit pour commencer

Apprends SQL avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
46
Leçons
183

Questions Fréquemment Posées

La leçon « Fuseaux horaires : TIMESTAMP contre TIMESTAMPTZ » est-elle gratuite ?

Oui — le texte complet de « Fuseaux horaires : TIMESTAMP contre TIMESTAMPTZ » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Fuseaux horaires : TIMESTAMP contre TIMESTAMPTZ » ?

Comprenez la différence entre TIMESTAMP et TIMESTAMPTZ, effectuez des conversions avec AT TIME ZONE et stockez les dates en UTC pour des applications portables. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Academy ?

Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Fuseaux horaires : TIMESTAMP contre TIMESTAMPTZ » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?

Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Arithmétique des dates et INTERVAL
  2. EXTRACT, DATE_TRUNC, AGE
  3. Fuseaux horaires : TIMESTAMP contre TIMESTAMPTZ
  4. Rapports courants sur les dates (MTD, WoW, YoY)
← Retour à SQL Academy