sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur AT TIME ZONE fungerar i PostgreSQL

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 zone timestamp without time zone Konvertera given tidsstämpel med tidszon till den nya tidszonen, utan tidszonsbeteckning
tidsstämpel utan tidszon VID TIDZON zone timestamp with time zone Behandla given tidsstämpel utan tidszon som ligger i den angivna tidszonen
tid med tidszon VID TIDZON zone 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.


  1. Vilken är den bästa databasstrukturen för att behålla flerspråkig data?

  2. VÄLJ * DÄR INTE FINNS

  3. Hur man skapar en procedur i ett paket i Oracle

  4. Hur man filtrerar objekt i SQL Server Management Studio (SSMS) - SQL Server / TSQL självstudie del 19