In PostgreSQL kunt u de timezone()
. gebruiken functie om een tijdstempel naar een andere tijdzone te converteren.
Syntaxis
De syntaxis gaat als volgt:
timezone(zone, timestamp)
Waar zone
is de tijdzone waarvan u de timestamp
. wilt hebben argument om naar te converteren.
Het resultaat dat u krijgt, hangt af van of de oorspronkelijke tijdstempelwaarde een tijdzone bevat of niet (en wat die waarde is).
Voorbeeld 1 -wanneer de originele tijdstempel de tijdzone wel bevat
Dit is wat er gebeurt als de oorspronkelijke tijdstempel de tijdzone bevat.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Resultaat:
2020-10-25 04:00:00
Als de oorspronkelijke tijdstempel de tijdzone bevat, wordt de timezone()
functie verschuift de oorspronkelijke tijdstempelwaarde naar de opgegeven tijdzone en retourneert de waarde zonder tijdzone.
Dit is wat er gebeurt als ik de tijdzone van de invoertijdstempel wijzig.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Resultaat:
2020-10-25 03: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 de oorspronkelijke tijdstempelwaarde verschoven naar de lokale tijdzone.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Resultaat:
2020-10-24 18:00:00
In dit geval is de resulterende tijdstempel zes uur teruggezet. Dit betekent dat mijn lokale tijdzone zes uur voorloopt op Indiaas/Mauritius.
We kunnen de tijdzone-offset zien die werd gebruikt door de invoerwaarde rechtstreeks te selecteren.
SELECT timestamp with time zone '2020-10-25 00:00:00';
Resultaat:
2020-10-25 00:00:00+10
Voorbeeld 2 – Wanneer de originele tijdstempel GEEN tijdzone bevat
Dit is wat er gebeurt als de originele tijdstempel niet een tijdzone opnemen.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Resultaat:
2020-10-25 06: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 timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Resultaat:
2020-10-25 06: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 '2020-10-25 00:00:00+12';
Resultaat:
2020-10-25 00:00:00
Voorbeeld 3 – lokale tijdstempel
Laten we de localtimestamp
. gebruiken functie om een vergelijking uit te voeren tussen de huidige tijdstempel in mijn eigen tijdzone en de resulterende tijdstempel na gebruik van de timezone()
functie om het naar een andere tijdzone te converteren.
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Resultaat:
lokale tijdstempel | 2020-07-08 15:42:04.965221tijdzone | 2020-07-08 21:42:04.965221+10
De localtimestamp
functie retourneert een tijdstempel gegevenstype, dat wordt geleverd met een impliciete "zonder tijdzone". Met andere woorden, tijdstempel en tijdstempel zonder tijdzone zijn hetzelfde.
Zoals eerder aangetoond, wanneer er geen tijdzone is opgegeven in de oorspronkelijke tijdstempel, is de huidige TimeZone
instelling wordt gebruikt en toegevoegd aan het resultaat. En dat is dus wat we krijgen als we localtimestamp
gebruiken .
Trouwens, in dit voorbeeld gebruikte ik \x
om het resultaat weer te geven met behulp van uitgebreide weergave/verticale uitvoer, alleen om het leesbaarder te maken.
Voorbeeld 4 – current_timestamp
Laten we nu de current_timestamp
. gebruiken functie in plaats van localtimestamp
.
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Resultaat (met verticale uitvoer):
current_timestamp | 2020-07-08 15:42:04.335669+10tijdzone | 2020-07-08 09:42:04.335669
Deze keer is de tijdzone-offset toegevoegd aan de oorspronkelijke tijdstempel en de timezone()
resultaat bevat het niet meer.
We krijgen dit resultaat omdat de current_timestamp
functie retourneert een tijdstempel met tijdzone gegevenstype.
Voorbeeld 5 – Tijdwaarden gebruiken
De timezone()
functie werkt ook met time
waarden (time with time zone
en time without time zone
).
Echter, bij gebruik op time with time zone
waarden, wordt de tijdzone-offset toegevoegd aan het resultaat.
SELECT
timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
timezone('Indian/Mauritius', time with time zone '00:00:00');
Resultaat (met verticale uitvoer):
tijdzone | 04:00:00+04tijdzone | 03:00:00+04tijdzone | 18:00:00+04
En voor de volledigheid, hier zijn dezelfde waarden met een time without time zone
gegevenstype.
SELECT
timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
timezone('Indian/Mauritius', time without time zone '00:00:00');
Resultaat (met verticale uitvoer):
tijdzone | 18:00:00+04tijdzone | 18:00:00+04tijdzone | 18:00:00+04
Controleer de lokale tijdzone
Als je je eigen lokale tijdzone wilt controleren, voer je SHOW TIMEZONE
. uit .
Dit is wat ik krijg als ik die opdracht uitvoer.
SHOW TIMEZONE;
Resultaat:
Australië/Brisbane
Controleer de tijdzone-offset
Gewapend met de bovenstaande kennis, kan ik nu de twee tijdzone-offsets controleren door de pg_timezone_names
op te vragen bekijken.
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Resultaat (met verticale uitvoer):
Zie Een lijst met door PostgreSQL ondersteunde tijdzones retourneren voor meer opties en voorbeelden voor het retourneren van de tijdzone in Postgres.