I PostgreSQL kan du använda AT TIME ZONE
sats för att konvertera en tidsstämpel till en annan tidszon.
Syntax
Du kan använda den med någon av följande 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
Där zone
är tidszonen som du vill att värdet till vänster ska konverteras till.
Bara för att vara tydlig är den enda skillnaden mellan de tre varianterna i datatypen för tidsstämpeln som ska konverteras.
De tre datatyperna är:
timestamp with time zone
timestamp without time zone
time with time zone
Resultatet du får beror på datatypen.
Följande tabell visar resultatet som varje variant ger.
Uttryck | Returtyp | Beskrivning |
---|---|---|
tidsstämpel med tidszon VID TIDZON | timestamp without time zone | Konvertera given tidsstämpel med tidszon till den nya tidszonen, utan tidszonsbeteckning |
tidsstämpel utan tidszon VID TIDZON | timestamp with time zone | Behandla given tidsstämpel utan tidszon som ligger i den angivna tidszonen |
tid med tidszon VID TIDZON | time with time zone | Konvertera given tid med tidszon till den nya tidszonen |
Variant 1
Här är vad som händer när du konverterar en timestamp with time zone
värde.
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 den ursprungliga tidsstämpeln är en timestamp with time zone
värde, flyttas det till den angivna tidszonen och resultatet returneras utan tidszonsförskjutning.
Det här är vad som händer om jag ändrar tidszonförskjutningen för inmatningsvärdet.
SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';
Resultat:
2025-11-20 01:00:00
Den resulterande tidsstämpeln skiftas enligt den inmatade tidszonen.
Och om du anger timestamp with time zone
, men den ursprungliga tidsstämpeln innehåller faktiskt inte en tidszon, då antas den lokala tidszonen.
SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';
Resultat:
2025-11-19 16:00:00
I det här fallet har den resulterande tidsstämpeln lagts tillbaka åtta timmar. Det betyder att min lokala tidszon ligger åtta timmar före Afrika/Kairo.
Vi kan se tidszonsförskjutningen som användes genom att välja inmatningsvärdet direkt.
SELECT timestamp with time zone '2025-11-20 00:00:00';
Resultat:
2025-11-20 00:00:00+10
Variant 2
Här är vad som händer när den ursprungliga tidsstämpeln använder en timestamp without time zone
värde.
Med andra ord, gör det inte inkludera en tidszon.
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 den ursprungliga tidsstämpeln inte inkluderar en tidszon, visas resultatet med den aktuella TimeZone
inställning och tidszonsförskjutning läggs till.
Detta gäller varje gång du anger timestamp without time zone
, även om tidsstämpeln faktiskt innehåller en tidszonförskjutning.
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
Detta är att vänta, för om jag bara väljer timestamp without time zone
värde, det här är vad jag får:
SELECT timestamp without time zone '2025-11-20 00:00:00+12';
Resultat:
2025-11-20 00:00:00
Variant 3
Här är vad som händer när den ursprungliga tidsstämpeln använder en time with time zone
värde.
SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';
Resultat:
02:00:00+02
Den konverterar den givna time with time zone
värde till den nya tidszonen och lägger till tidszonsförskjutningen till resultatet.
Det här är vad som händer om jag ändrar tidszonförskjutningen för inmatningsvärdet.
SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';
Resultat:
01:00:00+02
Den resulterande tidsstämpeln skiftas enligt den inmatade tidszonen.
Och om du anger time with time zone
, men den ursprungliga tidsstämpeln innehåller faktiskt inte en tidszon, den lokala tidszonen antas.
SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';
Resultat:
16:00:00+02
I det här fallet har den resulterande tidsstämpeln lagts tillbaka åtta timmar (eftersom min lokala tidszon ligger åtta timmar före Afrika/Kairo).
Vi kan se tidszonsförskjutningen som användes genom att välja inmatningsvärdet direkt.
SELECT time with time zone '00:00:00';
Resultat:
00:00:00+10
Tid utan tidszon
Även om Postgres-dokumentationen inte innehåller en time without time zone
variant, här är ett exempel i alla fall.
SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';
Resultat:
16:00:00+02
Så i det här exemplet antogs den lokala tidszonen för tidszonen som skulle konverteras.