sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur funktionen tidszon() fungerar i PostgreSQL

I PostgreSQL kan du använda timezone() funktion för att konvertera en tidsstämpel till en annan tidszon.

Syntax

Syntaxen ser ut så här:

timezone(zone, timestamp) 

Där zone är den tidszon som du vill ha timestamp argument som ska konverteras till.

Resultatet du får beror på om det ursprungliga tidsstämpelvärdet inkluderar en tidszon eller inte (och vad det värdet är).

Exempel 1 - När den ursprungliga tidsstämpeln INNEHÅLLER tidszonen

Här är vad som händer när den ursprungliga tidsstämpeln inkluderar tidszonen.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00'); 

Resultat:

2020-10-25 04:00:00

När den ursprungliga tidsstämpeln inkluderar tidszonen, timezone() funktionen flyttar det ursprungliga tidsstämpelvärdet till den angivna tidszonen och returnerar värdet utan tidszon.

Det här är vad som händer om jag ändrar tidszonen för inmatningstidsstämpeln.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01'); 

Resultat:

2020-10-25 03: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å flyttas det ursprungliga tidsstämpelvärdet till den lokala tidszonen.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00'); 

Resultat:

2020-10-24 18:00:00

I det här fallet har den resulterande tidsstämpeln lagts tillbaka sex timmar. Det betyder att min lokala tidszon ligger sex timmar före Indian/Mauritius.

Vi kan se tidszonsförskjutningen som användes genom att välja inmatningsvärdet direkt.

SELECT timestamp with time zone '2020-10-25 00:00:00'; 

Resultat:

2020-10-25 00:00:00+10

Exempel 2 – När den ursprungliga tidsstämpeln INTE inkluderar tidszonen

Här är vad som händer när den ursprungliga tidsstämpeln inte gör det inkludera en tidszon.

SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00'); 

Resultat:

2020-10-25 06: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 timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12'); 

Resultat:

2020-10-25 06: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 '2020-10-25 00:00:00+12'; 

Resultat:

2020-10-25 00:00:00

Exempel 3 – lokal tidsstämpel

Låt oss använda localtimestamp funktion för att köra en jämförelse mellan den aktuella tidsstämpeln i min egen tidszon och den resulterande tidsstämpeln efter att ha använt timezone() funktion för att konvertera den till en annan tidszon.

\x
SELECT 
  localtimestamp,
  timezone('Indian/Mauritius', localtimestamp); 

Resultat:

lokaltidsstämpel | 2020-07-08 15:42:04.965221tidszon | 2020-07-08 21:42:04.965221+10

localtimestamp funktion returnerar en tidsstämpel datatyp, som kommer med en implicit "utan tidszon". Med andra ord, tidsstämpel och tidsstämpel utan tidszon är samma sak.

Som visats tidigare, när ingen tidszon är angiven i den ursprungliga tidsstämpeln, den nuvarande TimeZone inställningen används och läggs till resultatet. Och så det är vad vi får när vi använder localtimestamp .

Förresten, i det här exemplet använde jag \x för att visa resultatet med utökad display/vertikal utdata, bara för att göra det lättare att läsa.

Exempel 4 – aktuell_tidsstämpel

Låt oss nu använda current_timestamp funktion istället för localtimestamp .

SELECT 
  current_timestamp,
  timezone('Indian/Mauritius', current_timestamp); 

Resultat (med vertikal utdata):

current_timestamp | 2020-07-08 15:42:04.335669+10tidszon | 2020-07-08 09:42:04.335669

Den här gången har tidszonsförskjutningen lagts till den ursprungliga tidsstämpeln och timezone() resultatet inkluderar det inte längre.

Vi får det här resultatet eftersom current_timestamp funktion returnerar en tidsstämpel med tidszon datatyp.

Exempel 5 – Använda tidsvärden

timezone() Funktionen fungerar även med time värden (time with time zone och time without time zone ).

Men när du använder den på time with time zone värden, läggs tidszonförskjutningen till resultatet.

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'); 

Resultat (med vertikal utdata):

tidszon | 04:00:00+04tidszon | 03:00:00+04tidszon | 18:00:00+04

Och för fullständighetens skull, här är samma värden som använder en time without time zone datatyp.

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'); 

Resultat (med vertikal utdata):

tidszon | 18:00:00+04tidszon | 18:00:00+04tidszon | 18:00:00+04

Kontrollera den lokala tidszonen

Om du vill kontrollera din egen lokala tidszon, kör SHOW TIMEZONE .

Det här är vad jag får när jag kör det kommandot.

SHOW TIMEZONE; 

Resultat:

Australien/Brisbane

Kontrollera tidszonsförskjutningen

Beväpnad med ovanstående kunskap kan jag nu kontrollera de två tidszonsförskjutningarna genom att fråga pg_timezone_names visa.

SELECT * 
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane'; 

Resultat (med vertikal utdata):

namn | förkorta | utc_offset | is_dst---------------------+--------+------------+------ --Indian/Mauritius | +04 | 04:00:00 | fAustralien/Brisbane | AEST | 10:00:00 | f

Se Returnera en lista över tidszoner som stöds av PostgreSQL för fler alternativ och exempel för att returnera tidszonen i Postgres.


  1. MS Access till Oracle enkel konvertering/migrering

  2. 7 sätt att hitta dubbletter av rader medan du ignorerar den primära nyckeln i MySQL

  3. Är vi redo för Nordic PGDay?

  4. REPLACE() Funktion i Oracle