sql >> Database >  >> RDS >> PostgreSQL

Hoe AT TIME ZONE werkt in PostgreSQL

In PostgreSQL kunt u de AT TIME ZONE . gebruiken clausule om een ​​tijdstempel om te zetten naar een andere tijdzone.

Syntaxis

Je kunt het gebruiken met een van de volgende drie varianten:

timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone

Waar zone is de tijdzone waarnaar u de waarde aan de linkerkant wilt converteren.

Voor alle duidelijkheid:het enige verschil tussen de drie varianten zit in het gegevenstype van de tijdstempel die moet worden geconverteerd.

De drie gegevenstypen zijn:

  • timestamp with time zone
  • timestamp without time zone
  • time with time zone

Het resultaat dat u krijgt, hangt af van het gegevenstype.

De volgende tabel geeft het resultaat weer dat elke variant oplevert.

Expressie Retourtype Beschrijving
timestamp with time zone AT TIME ZONE zone timestamp without time zone Gegeven tijdstempel converteren met tijdzone naar de nieuwe tijdzone, zonder tijdzoneaanduiding
timestamp without time zone AT TIME ZONE zone timestamp with time zone Behandel een gegeven tijdstempel zonder tijdzone zoals gelegen in de opgegeven tijdzone
time with time zone AT TIME ZONE zone time with time zone Gegeven tijd converteren met tijdzone naar de nieuwe tijdzone

Variant 1

Dit gebeurt er als je een timestamp with time zone converteert waarde.

SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Resultaat:

2025-11-20 02:00:00

Wanneer de originele tijdstempel een timestamp with time zone is waarde wordt verschoven naar de opgegeven tijdzone en het resultaat wordt geretourneerd zonder een tijdzoneverschuiving.

Dit is wat er gebeurt als ik de tijdzone-offset van de invoerwaarde wijzig.

SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Resultaat:

2025-11-20 01:00:00

De resulterende tijdstempel wordt verschoven volgens de ingevoerde tijdzone.

En als u timestamp with time zone . opgeeft , maar de oorspronkelijke tijdstempel bevat eigenlijk geen tijdzone, dan wordt uitgegaan van de lokale tijdzone.

SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultaat:

2025-11-19 16:00:00

In dit geval is de resulterende tijdstempel acht uur teruggezet. Dit betekent dat mijn lokale tijdzone acht uur voorloopt op Afrika/Caïro.

We kunnen de tijdzone-offset zien die werd gebruikt door de invoerwaarde rechtstreeks te selecteren.

SELECT timestamp with time zone '2025-11-20 00:00:00';

Resultaat:

2025-11-20 00:00:00+10

Variant 2

Dit is wat er gebeurt als de oorspronkelijke tijdstempel een timestamp without time zone gebruikt waarde.

Met andere woorden, het niet een tijdzone opnemen.

SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultaat:

2025-11-20 08:00:00+10

Als de oorspronkelijke tijdstempel geen tijdzone bevat, wordt het resultaat weergegeven met de huidige TimeZone instelling en de tijdzone-offset wordt toegevoegd.

Dit is van toepassing wanneer u timestamp without time zone opgeeft , zelfs als de tijdstempel inderdaad een tijdzoneverschuiving bevat.

SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';

Resultaat:

2025-11-20 08:00:00+10

Dit is te verwachten, want als ik alleen de timestamp without time zone selecteer waarde, dit is wat ik krijg:

SELECT timestamp without time zone '2025-11-20 00:00:00+12';

Resultaat:

2025-11-20 00:00:00

Variant 3

Dit is wat er gebeurt als de originele tijdstempel een time with time zone gebruikt waarde.

SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Resultaat:

02:00:00+02

Het converteert de gegeven time with time zone waarde toe aan de nieuwe tijdzone en voegt de tijdzone-offset toe aan het resultaat.

Dit is wat er gebeurt als ik de tijdzone-offset van de invoerwaarde wijzig.

SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Resultaat:

01:00:00+02

De resulterende tijdstempel wordt verschoven volgens de ingevoerde tijdzone.

En als u time with time zone opgeeft , maar de originele tijdstempel bevat eigenlijk geen tijdzone, de lokale tijdzone wordt verondersteld.

SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultaat:

16:00:00+02

In dit geval is de resulterende tijdstempel acht uur teruggezet (omdat mijn lokale tijdzone acht uur voorloopt op Afrika/Caïro).

We kunnen de tijdzone-offset zien die werd gebruikt door de invoerwaarde rechtstreeks te selecteren.

SELECT time with time zone '00:00:00';

Resultaat:

00:00:00+10

Tijd zonder tijdzone

Hoewel de Postgres-documentatie geen time without time zone bevat variant, hier is toch een voorbeeld.

SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultaat:

16:00:00+02

In dit voorbeeld is dus uitgegaan van de lokale tijdzone voor de te converteren tijdzone.


  1. Gebruiksscenario's voor MariaDB en Docker, deel 1

  2. Hoe ABS() werkt in MariaDB

  3. 4 manieren om rijen te vinden die hoofdletters bevatten in MariaDB

  4. subquery in FROM moet een alias hebben