I PostgreSQL kan du bruge AT TIME ZONE
klausul for at konvertere et tidsstempel til en anden tidszone.
Syntaks
Du kan bruge den med en af følgende tre varianter:
timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone
Hvor zone
er den tidszone, som du ønsker, at værdien til venstre skal konverteres til.
Bare for at være klar, er den eneste forskel mellem de tre varianter i datatypen for tidsstemplet, der skal konverteres.
De tre datatyper er:
timestamp with time zone
timestamp without time zone
time with time zone
Det resultat, du får, afhænger af datatypen.
Følgende tabel viser det resultat, som hver variant producerer.
Udtryk | Returtype | Beskrivelse |
---|---|---|
timestamp with time zone AT TIME ZONE | timestamp without time zone | Konverter givet tidsstempel med tidszone til den nye tidszone, uden tidszonebetegnelse |
timestamp without time zone AT TIME ZONE | timestamp with time zone | Behandle givet tidsstempel uden tidszone som placeret i den angivne tidszone |
time with time zone AT TIME ZONE | time with time zone | Konverter given tid med tidszone til den nye tidszone |
Variant 1
Her er, hvad der sker, når du konverterer et timestamp with time zone
værdi.
SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';
Resultat:
2025-11-20 02:00:00
Når det originale tidsstempel er et timestamp with time zone
værdi, flyttes den til den angivne tidszone, og resultatet returneres uden tidszoneforskydning.
Her er, hvad der sker, hvis jeg ændrer tidszoneforskydningen af inputværdien.
SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';
Resultat:
2025-11-20 01: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å antages den lokale tidszone.
SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';
Resultat:
2025-11-19 16:00:00
I dette tilfælde er det resulterende tidsstempel blevet sat otte timer tilbage. Det betyder, at min lokale tidszone er otte timer foran Afrika/Cairo.
Vi kan se tidszoneforskydningen, der blev brugt, ved at vælge inputværdien direkte.
SELECT timestamp with time zone '2025-11-20 00:00:00';
Resultat:
2025-11-20 00:00:00+10
Variant 2
Her er, hvad der sker, når det originale tidsstempel bruger et timestamp without time zone
værdi.
Med andre ord, gør den ikke inkludere en tidszone.
SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';
Resultat:
2025-11-20 08:00:00+10
Når det oprindelige 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 timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';
Resultat:
2025-11-20 08: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 '2025-11-20 00:00:00+12';
Resultat:
2025-11-20 00:00:00
Variant 3
Her er, hvad der sker, når det originale tidsstempel bruger en time with time zone
værdi.
SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';
Resultat:
02:00:00+02
Den konverterer den givne time with time zone
værdi til den nye tidszone, og tilføjer tidszoneforskydningen til resultatet.
Her er, hvad der sker, hvis jeg ændrer tidszoneforskydningen af inputværdien.
SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';
Resultat:
01:00:00+02
Det resulterende tidsstempel forskydes i henhold til input-tidszonen.
Og hvis du angiver time with time zone
, men det oprindelige tidsstempel inkluderer faktisk ikke en tidszone, den lokale tidszone antages.
SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';
Resultat:
16:00:00+02
I dette tilfælde er det resulterende tidsstempel blevet sat otte timer tilbage (fordi min lokale tidszone er otte timer foran Afrika/Cairo).
Vi kan se tidszoneforskydningen, der blev brugt, ved at vælge inputværdien direkte.
SELECT time with time zone '00:00:00';
Resultat:
00:00:00+10
Tid uden tidszone
Selvom Postgres-dokumentationen ikke inkluderer en time without time zone
variant, her er et eksempel alligevel.
SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';
Resultat:
16:00:00+02
Så i dette eksempel blev den lokale tidszone antaget for tidszonen, der skulle konverteres.