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

Come funziona la funzione timezone() in PostgreSQL

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.