In PostgreSQL puoi usare AT TIME ZONE
clausola per convertire un timestamp in un altro fuso orario.
Sintassi
Puoi usarlo con una delle seguenti tre varianti:
timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone
Dove zone
è il fuso orario in cui si desidera convertire il valore a sinistra.
Per essere chiari, l'unica differenza tra le tre varianti è nel tipo di dati del timestamp da convertire.
I tre tipi di dati sono:
timestamp with time zone
timestamp without time zone
time with time zone
Il risultato che otterrai dipenderà dal tipo di dati.
La tabella seguente delinea il risultato prodotto da ciascuna variante.
Espressione | Tipo di reso | Descrizione |
---|---|---|
marca temporale con fuso orario AT TIME ZONE | timestamp without time zone | Convertire il timestamp specificato con il fuso orario al nuovo fuso orario, senza designazione di fuso orario |
marca temporale senza fuso orario AT TIME ZONE | timestamp with time zone | Tratta il timestamp senza fuso orario come situato nel fuso orario specificato |
time with time zone AT TIME ZONE | time with time zone | Convertire l'ora specificata con il fuso orario al nuovo fuso orario |
Variante 1
Ecco cosa succede quando converti un timestamp with time zone
valore.
SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';
Risultato:
2025-11-20 02:00:00
Quando il timestamp originale è un timestamp with time zone
valore, viene spostato nel fuso orario specificato e il risultato viene restituito senza un offset del fuso orario.
Ecco cosa succede se cambio l'offset del fuso orario del valore di input.
SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';
Risultato:
2025-11-20 01:00:00
Il timestamp risultante viene spostato in base al fuso orario di input.
E se specifichi timestamp with time zone
, ma il timestamp originale non include effettivamente un fuso orario, quindi viene assunto il fuso orario locale.
SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';
Risultato:
2025-11-19 16:00:00
In questo caso, il timestamp risultante è stato riportato indietro di otto ore. Ciò significa che il mio fuso orario locale è otto ore avanti rispetto all'Africa/Cairo.
Possiamo vedere l'offset del fuso orario che è stato utilizzato selezionando direttamente il valore di input.
SELECT timestamp with time zone '2025-11-20 00:00:00';
Risultato:
2025-11-20 00:00:00+10
Variante 2
Ecco cosa succede quando il timestamp originale utilizza un timestamp without time zone
valore.
In altre parole, non includi un fuso orario.
SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';
Risultato:
2025-11-20 08:00:00+10
Quando il timestamp originale non include un fuso orario, il risultato viene visualizzato utilizzando il TimeZone
corrente impostazione e l'offset del fuso orario viene aggiunto.
Questo si applica ogni volta che specifichi timestamp without time zone
, anche se il timestamp contiene effettivamente un fuso orario.
SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';
Risultato:
2025-11-20 08:00:00+10
Questo è prevedibile, perché se seleziono solo il timestamp without time zone
valore, questo è quello che ottengo:
SELECT timestamp without time zone '2025-11-20 00:00:00+12';
Risultato:
2025-11-20 00:00:00
Variante 3
Ecco cosa succede quando il timestamp originale utilizza un time with time zone
valore.
SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';
Risultato:
02:00:00+02
Converte l'time with time zone
specificato valore al nuovo fuso orario e aggiunge l'offset del fuso orario al risultato.
Ecco cosa succede se cambio l'offset del fuso orario del valore di input.
SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';
Risultato:
01:00:00+02
Il timestamp risultante viene spostato in base al fuso orario di input.
E se specifichi time with time zone
, ma il timestamp originale non include effettivamente un fuso orario, si presume il fuso orario locale.
SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';
Risultato:
16:00:00+02
In questo caso, il timestamp risultante è stato riportato indietro di otto ore (perché il mio fuso orario locale è otto ore avanti rispetto all'Africa/Cairo).
Possiamo vedere l'offset del fuso orario che è stato utilizzato selezionando direttamente il valore di input.
SELECT time with time zone '00:00:00';
Risultato:
00:00:00+10
Tempo senza fuso orario
Sebbene la documentazione di Postgres non includa un time without time zone
variante, ecco comunque un esempio.
SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';
Risultato:
16:00:00+02
Quindi in questo esempio è stato assunto il fuso orario locale per la conversione del fuso orario.