In PostgreSQL, puoi usare timezone()
funzione per convertire un timestamp in un altro fuso orario.
Sintassi
La sintassi è questa:
timezone(zone, timestamp)
Dove zone
è il fuso orario in cui desideri inserire il timestamp
argomento in cui convertire.
Il risultato che otterrai dipenderà dal fatto che il valore del timestamp originale includa o meno un fuso orario (e quale sia quel valore).
Esempio 1:quando il timestamp originale include il fuso orario
Ecco cosa succede quando il timestamp originale include il fuso orario.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Risultato:
2020-10-25 04:00:00
Quando il timestamp originale include il fuso orario, il timezone()
La funzione sposta il valore del timestamp originale nel fuso orario specificato e restituisce il valore senza un fuso orario.
Ecco cosa succede se cambio il fuso orario del timestamp di input.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Risultato:
2020-10-25 03: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 il valore del timestamp originale viene spostato nel fuso orario locale.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Risultato:
2020-10-24 18:00:00
In questo caso, il timestamp risultante è stato riportato indietro di sei ore. Ciò significa che il mio fuso orario locale è sei ore avanti rispetto a Indian/Mauritius.
Possiamo vedere l'offset del fuso orario che è stato utilizzato selezionando direttamente il valore di input.
SELECT timestamp with time zone '2020-10-25 00:00:00';
Risultato:
2020-10-25 00:00:00+10
Esempio 2:quando il timestamp originale NON include il fuso orario
Ecco cosa succede quando il timestamp originale non lo fa includi un fuso orario.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Risultato:
2020-10-25 06: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 timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Risultato:
2020-10-25 06:00:00+10
Questo è prevedibile, perché se seleziono solo il timestamp without time zone
valore, questo è quello che ottengo:
SELECT timestamp without time zone '2020-10-25 00:00:00+12';
Risultato:
2020-10-25 00:00:00
Esempio 3 – timestamp locale
Usiamo il localtimestamp
funzione per eseguire un confronto tra il timestamp corrente nel mio fuso orario e il timestamp risultante dopo aver utilizzato timezone()
funzione per convertirlo in un fuso orario diverso.
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Risultato:
localtimestamp | 2020-07-08 15:42:04.965221 timezone | 2020-07-08 21:42:04.965221+10
Il localtimestamp
la funzione restituisce un timestamp tipo di dati, che viene fornito con un implicito "senza fuso orario". In altre parole, timestamp e indicatore orario senza fuso orario sono la stessa cosa.
Come dimostrato in precedenza, quando non è specificato alcun fuso orario nel timestamp originale, l'attuale TimeZone
l'impostazione viene utilizzata e aggiunta al risultato. Ed ecco cosa otteniamo quando utilizziamo localtimestamp
.
A proposito, in questo esempio ho usato \x
per visualizzare il risultato utilizzando display espanso/output verticale, solo per facilitarne la lettura.
Esempio 4:timestamp_corrente
Ora usiamo il current_timestamp
funzione invece di localtimestamp
.
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Risultato (usando l'output verticale):
current_timestamp | 2020-07-08 15:42:04.335669+10 timezone | 2020-07-08 09:42:04.335669
Questa volta l'offset del fuso orario è stato aggiunto al timestamp originale e al timezone()
il risultato non lo include più.
Otteniamo questo risultato perché current_timestamp
la funzione restituisce un timestamp con fuso orario tipo di dati.
Esempio 5 – Utilizzo dei valori temporali
Il timezone()
la funzione funziona anche con time
valori (time with time zone
e time without time zone
).
Tuttavia, quando lo si utilizza su time with time zone
valori, l'offset del fuso orario viene aggiunto al risultato.
SELECT
timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
timezone('Indian/Mauritius', time with time zone '00:00:00');
Risultato (usando l'output verticale):
timezone | 04:00:00+04 timezone | 03:00:00+04 timezone | 18:00:00+04
E per completezza, ecco gli stessi valori che utilizzano un time without time zone
tipo di dati.
SELECT
timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
timezone('Indian/Mauritius', time without time zone '00:00:00');
Risultato (usando l'output verticale):
timezone | 18:00:00+04 timezone | 18:00:00+04 timezone | 18:00:00+04
Controlla il fuso orario locale
Se desideri controllare il tuo fuso orario locale, esegui SHOW TIMEZONE
.
Ecco cosa ottengo quando eseguo quel comando.
SHOW TIMEZONE;
Risultato:
Australia/Brisbane
Controlla l'offset del fuso orario
Forte delle conoscenze di cui sopra, ora posso controllare i due offset di fuso orario interrogando pg_timezone_names
visualizza.
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Risultato (usando l'output verticale):
name | abbrev | utc_offset | is_dst --------------------+--------+------------+-------- Indian/Mauritius | +04 | 04:00:00 | f Australia/Brisbane | AEST | 10:00:00 | f
Consulta Restituire un elenco di fusi orari supportati da PostgreSQL per ulteriori opzioni ed esempi per restituire il fuso orario in Postgres.