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:
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):
Se Returner en liste over tidszoner understøttet af PostgreSQL for flere muligheder og eksempler på returnering af tidszonen i Postgres.