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.