SQL Academy · Lezione

Fusi orari: TIMESTAMP rispetto a TIMESTAMPTZ

Comprenda la differenza tra TIMESTAMP e TIMESTAMPTZ, converta con AT TIME ZONE e memorizzi i dati in UTC per applicazioni portabili

Lezione 3 di 413 passaggi

Fusi orari: TIMESTAMP rispetto a TIMESTAMPTZ è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

Due tipi di timestamp

PostgreSQL dispone di DUE tipi di timestamp:

  • TIMESTAMP — timestamp «ingenuo», senza informazioni sul fuso orario
  • TIMESTAMPTZ — timestamp con fuso orario (memorizzato internamente in UTC)

Regola generale: preferisca TIMESTAMPTZ per gli eventi; usi TIMESTAMP per orari puramente astratti come «le 9:00 durante l'orario di lavoro».

Come funziona TIMESTAMPTZ

Viene sempre memorizzato internamente in UTC. Durante INSERT, l'input viene convertito dal fuso orario della sessione in UTC. Durante SELECT, l'output viene riconvertito nel fuso orario della sessione.

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 perde informazioni

Un TIMESTAMP semplice non conosce il fuso orario. «2024-03-15 12:00:00» potrebbe indicare qualsiasi ora locale. Quando gli utenti cambiano fuso orario, il significato viene perso.

AT TIME ZONE

Convertire tra fusi orari per la visualizzazione:

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;

Memorizzare in UTC e visualizzare nell'ora locale

Procedura consigliata: memorizzi TIMESTAMPTZ, lo converta nel fuso orario dell'utente in SELECT e non faccia mai il contrario.

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;

FUSO ORARIO DELLA SESSIONE

Può impostarlo per sessione, per utente o globalmente:

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

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

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

SPECIFICARE IL FUSO NEL LETTERALE

Includa un fuso orario nel letterale:

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

NOW() restituisce TIMESTAMPTZ

NOW() e CURRENT_TIMESTAMP restituiscono sempre TIMESTAMPTZ. Combinarli con colonne TIMESTAMP è un errore comune.

Quando usare TIMESTAMP (senza fuso)

Per orari astratti o locali che non dipendono realmente da un fuso — «il negozio apre alle 09:00» — usi TIMESTAMP (o TIME).

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

Transizioni all'ora legale

TIMESTAMPTZ gestisce automaticamente l'ora legale. L'aggiunta di INTERVAL funziona in ore dell'orologio, a meno che non si attraversi il passaggio all'ora legale: in tal caso l'orario può variare di 23 o 25 ore.

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

Non memorizzi gli offset, ma i nomi dei fusi

Un offset come +02:00 non indica quando entra in vigore l'ora legale. Un nome di fuso come Europe/Berlin sì. Quando memorizza il fuso principale di un utente, salvi il nome IANA.

Riepilogo

Per gli eventi, scelga TIMESTAMPTZ come impostazione predefinita.

  • Memorizzato in UTC, visualizzato nel fuso orario della sessione
  • Convertire per la visualizzazione con AT TIME ZONE
  • Usare TIMESTAMP (senza fuso) solo per orari locali astratti

Verifica rapida

Sta sviluppando un SaaS globale che registra gli eventi degli utenti. Quale tipo di timestamp dovrebbe usare per la colonna occurred_at?

Gratis per iniziare

Impara SQL con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
46
Lezioni
183

Domande Frequenti

La lezione «Fusi orari: TIMESTAMP rispetto a TIMESTAMPTZ» è gratuita?

Sì — il testo completo di «Fusi orari: TIMESTAMP rispetto a TIMESTAMPTZ» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «Fusi orari: TIMESTAMP rispetto a TIMESTAMPTZ»?

Comprenda la differenza tra TIMESTAMP e TIMESTAMPTZ, converta con AT TIME ZONE e memorizzi i dati in UTC per applicazioni portabili Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Fusi orari: TIMESTAMP rispetto a TIMESTAMPTZ»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Academy?

Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Aritmetica delle date e INTERVAL
  2. EXTRACT, DATE_TRUNC, AGE
  3. Fusi orari: TIMESTAMP rispetto a TIMESTAMPTZ
  4. Report comuni sulle date (MTD, WoW, YoY)
← Torna a SQL Academy