sql >> Database >  >> RDS >> PostgreSQL

Hoe de timezone()-functie werkt in PostgreSQL

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):

naam | afkorting | utc_offset | is_dst--------------------+--------+------------+------ --Indiaas/Mauritius | +04 | 04:00:00 | fAustralië/Brisbane | AEST | 10:00:00 | f

Zie Een lijst met door PostgreSQL ondersteunde tijdzones retourneren voor meer opties en voorbeelden voor het retourneren van de tijdzone in Postgres.


  1. Is er in Oracle een functie die het verschil tussen twee datums berekent?

  2. 12c IDENTITEIT kolommen

  3. Installeer SQL Server 2016

  4. CDB-vloot beheren in Oracle Database 18c