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 zonetimestamp without time zonetime 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.