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.
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 fuseauTIMESTAMPTZ— 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+00TIMESTAMP 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 31Ne 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 ?
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
- Arithmétique des dates et INTERVAL
- EXTRACT, DATE_TRUNC, AGE
- Fuseaux horaires : TIMESTAMP contre TIMESTAMPTZ
- Rapports courants sur les dates (MTD, WoW, YoY)