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

Sådan fungerer tidszone()-funktionen i PostgreSQL

I PostgreSQL kan du bruge timezone() funktion til at konvertere et tidsstempel til en anden tidszone.

Syntaks

Syntaksen ser sådan ud:

timezone(zone, timestamp) 

Hvor zone er den tidszone, du vil have timestamp for argument, der skal konverteres til.

Det resultat, du får, afhænger af, om den oprindelige tidsstempelværdi inkluderer en tidszone eller ej (og hvad denne værdi er).

Eksempel 1 - Når det oprindelige tidsstempel inkluderer tidszonen

Her er, hvad der sker, når det originale tidsstempel inkluderer tidszonen.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00'); 

Resultat:

2020-10-25 04:00:00

Når det originale tidsstempel inkluderer tidszonen, timezone() funktion flytter den oprindelige tidsstempelværdi til den angivne tidszone og returnerer værdien uden en tidszone.

Her er, hvad der sker, hvis jeg ændrer tidszonen for inputtidsstemplet.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01'); 

Resultat:

2020-10-25 03:00:00

Det resulterende tidsstempel forskydes i henhold til input-tidszonen.

Og hvis du angiver timestamp with time zone , men det oprindelige tidsstempel inkluderer faktisk ikke en tidszone, så flyttes den oprindelige tidsstempelværdi til den lokale tidszone.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00'); 

Resultat:

2020-10-24 18:00:00

I dette tilfælde er det resulterende tidsstempel blevet sat seks timer tilbage. Det betyder, at min lokale tidszone er seks timer foran Indian/Mauritius.

Vi kan se tidszoneforskydningen, der blev brugt, ved at vælge inputværdien direkte.

SELECT timestamp with time zone '2020-10-25 00:00:00'; 

Resultat:

2020-10-25 00:00:00+10

Eksempel 2 – Når det originale tidsstempel IKKE inkluderer tidszonen

Her er, hvad der sker, når det originale tidsstempel ikke gør det inkludere en tidszone.

SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00'); 

Resultat:

2020-10-25 06:00:00+10

Når det originale tidsstempel ikke inkluderer en tidszone, vises resultatet ved hjælp af den aktuelle TimeZone indstilling, og tidszoneforskydningen tilføjes.

Dette gælder hver gang du angiver timestamp without time zone , selvom tidsstemplet faktisk indeholder en tidszoneforskydning.

SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12'); 

Resultat:

2020-10-25 06:00:00+10

Dette kan forventes, for hvis jeg kun vælger timestamp without time zone værdi, dette er hvad jeg får:

SELECT timestamp without time zone '2020-10-25 00:00:00+12'; 

Resultat:

2020-10-25 00:00:00

Eksempel 3 – lokaltidsstempel

Lad os bruge localtimestamp funktion til at køre en sammenligning mellem det aktuelle tidsstempel i min egen tidszone og det resulterende tidsstempel efter brug af timezone() funktion for at konvertere den til en anden tidszone.

\x
SELECT 
  localtimestamp,
  timezone('Indian/Mauritius', localtimestamp); 

Resultat:

lokaltidsstempel | 2020-07-08 15:42:04.965221tidszone | 2020-07-08 21:42:04.965221+10

localtimestamp funktion returnerer et tidsstempel datatype, som kommer med en implicit "uden tidszone". Med andre ord, tidsstempel og tidsstempel uden tidszone er det samme.

Som vist tidligere, når der ikke er angivet nogen tidszone i det oprindelige tidsstempel, vil den aktuelle TimeZone indstilling bruges og tilføjes resultatet. Og det er det, vi får, når vi bruger localtimestamp .

Forresten, i dette eksempel brugte jeg \x for at vise resultatet ved hjælp af udvidet display/lodret output, bare for at gøre det nemmere at læse.

Eksempel 4 – nuværende_tidsstempel

Lad os nu bruge current_timestamp funktion i stedet for localtimestamp .

SELECT 
  current_timestamp,
  timezone('Indian/Mauritius', current_timestamp); 

Resultat (ved hjælp af lodret output):

aktuelt_tidsstempel | 2020-07-08 15:42:04.335669+10tidszone | 2020-07-08 09:42:04.335669

Denne gang er tidszoneforskydningen blevet tilføjet til det originale tidsstempel, og timezone() resultatet inkluderer det ikke længere.

Vi får dette resultat fordi current_timestamp funktion returnerer et tidsstempel med tidszone datatype.

Eksempel 5 – Brug af tidsværdier

timezone() funktion fungerer også med time værdier (time with time zone og time without time zone ).

Men når du bruger det på time with time zone værdier, tilføjes tidszoneforskydningen til resultatet.

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'); 

Resultat (ved hjælp af lodret output):

tidszone | 04:00:00+04tidszone | 03:00:00+04tidszone | 18:00:00+04

Og for fuldstændighedens skyld er her de samme værdier ved hjælp af en time without time zone datatype.

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'); 

Resultat (ved hjælp af lodret output):

tidszone | 18:00:00+04tidszone | 18:00:00+04tidszone | 18:00:00+04

Tjek den lokale tidszone

Hvis du vil tjekke din egen lokale tidszone, skal du køre SHOW TIMEZONE .

Her er, hvad jeg får, når jeg kører den kommando.

SHOW TIMEZONE; 

Resultat:

Australien/Brisbane

Tjek tidszoneforskydningen

Bevæbnet med ovenstående viden kan jeg nu kontrollere de to tidszoneforskydninger ved at forespørge på pg_timezone_names se.

SELECT * 
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane'; 

Resultat (ved hjælp af lodret output):

navn | forkortelse | utc_offset | is_dst---------------------+--------+------------+------ --Indisk/Mauritius | +04 | 04:00:00 | fAustralien/Brisbane | AEST | 10:00:00 | f

Se Returner en liste over tidszoner understøttet af PostgreSQL for flere muligheder og eksempler på returnering af tidszonen i Postgres.


  1. Switchover/Switchback i Slony-I under opgradering af PostgreSQL større versioner 8.4.x/9.3.x

  2. SQL VÆLG SUM

  3. Android - SQLite - VÆLG MELLEM Dato1 OG Dato2

  4. Fejl 1046 Ingen database valgt, hvordan løses det?