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 zonetimestamp without time zonetime 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.