sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan fungerer AT TIME ZONE i PostgreSQL

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 zone timestamp without time zone Konverter givet tidsstempel med tidszone til den nye tidszone, uden tidszonebetegnelse
timestamp without time zone AT TIME ZONE zone timestamp with time zone Behandle givet tidsstempel uden tidszone som placeret i den angivne tidszone
time with time zone AT TIME ZONE 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.


  1. SQRT() Eksempler i SQL Server

  2. Sådan tilføjer du dage til en dato i MySQL

  3. Overvågning af ydeevnetællere via PERFMON | SQL Server Performance Fejlfinding -3

  4. SQLite - Opret et forhold