PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come funziona AT TIME ZONE in PostgreSQL

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 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 zone timestamp with time zone Tratta il timestamp senza fuso orario come situato nel fuso orario specificato
time with time zone AT TIME ZONE 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.