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):
Se Returnera en lista över tidszoner som stöds av PostgreSQL för fler alternativ och exempel för att returnera tidszonen i Postgres.