В PostgreSQL можете да използвате timezone()
функция за преобразуване на времева марка в друга часова зона.
Синтаксис
Синтаксисът е така:
timezone(zone, timestamp)
Където zone
е часовата зона, за която искате timestamp
аргумент, към който да се преобразува.
Резултатът, който ще получите, ще зависи от това дали първоначалната стойност на времевия клей включва часова зона или не (и каква е тази стойност).
Пример 1 – Когато оригиналното клеймо за време ВКЛЮЧВА часовата зона
Ето какво се случва, когато оригиналната времева марка включва часовата зона.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Резултат:
25.10.2020 04:00:00
Когато оригиналната времева марка включва часовата зона, timezone()
функцията измества първоначалната стойност на времевия клей към определената часова зона и връща стойността без часова зона.
Ето какво се случва, ако сменя часовата зона на въведената времева марка.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Резултат:
25.10.2020 03:00:00
Полученото времеви печат се измества според въведената часова зона.
И ако посочите timestamp with time zone
, но оригиналното клеймо за време всъщност не включва часова зона, тогава първоначалната стойност на времевата марка се измества към местната часова зона.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Резултат:
24.10.2020 18:00:00
В този случай получената времева марка е върната шест часа назад. Това означава, че моята местна часова зона е шест часа по-напред от Индия/Мавриций.
Можем да видим изместването на часовата зона, което е използвано, като изберем директно входната стойност.
SELECT timestamp with time zone '2020-10-25 00:00:00';
Резултат:
25.10.2020 00:00:00+10
Пример 2 – Когато оригиналното клеймо за време НЕ включва часовата зона
Ето какво се случва, когато оригиналното времеви печат не включва часова зона.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Резултат:
25.10.2020 06:00:00+10
Когато оригиналната времева марка не включва часова зона, резултатът се показва с помощта на текущата TimeZone
настройка и отместването на часовата зона се добавя.
Това се прилага всеки път, когато посочите timestamp without time zone
, дори ако клеймото за време всъщност съдържа изместване на часовата зона.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Резултат:
25.10.2020 06:00:00+10
Това може да се очаква, защото ако избера само timestamp without time zone
стойност, това получавам:
SELECT timestamp without time zone '2020-10-25 00:00:00+12';
Резултат:
25.10.2020 00:00:00
Пример 3 – клеймо за местно време
Нека използваме localtimestamp
функция за стартиране на сравнение между текущата времева марка в моята собствена часова зона и получената времева марка след използване на timezone()
функция, за да го преобразувате в друга часова зона.
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Резултат:
местен час | 2020-07-08 15:42:04.965221часова зона | 2020-07-08 21:42:04.965221+10
localtimestamp
функцията връща клеймо за време тип данни, който идва с имплицитно „без часова зона“. С други думи, клеймо за време и клеймо за време без часова зона са едно и също нещо.
Както беше показано по-рано, когато не е посочена часова зона в оригиналната времева марка, текущата TimeZone
настройката се използва и се добавя към резултата. И така, това получаваме, когато използваме localtimestamp
.
Между другото, в този пример използвах \x
за да покажете резултата с помощта на разширен дисплей/вертикален изход, само за да го улесните за четене.
Пример 4 – текуща_времева марка
Сега нека използваме current_timestamp
функция вместо localtimestamp
.
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Резултат (с помощта на вертикален изход):
текуща_времева марка | 2020-07-08 15:42:04.335669+10часова зона | 2020-07-08 09:42:04.335669
Този път отместването на часовата зона е добавено към оригиналната времева марка и timezone()
резултатът вече не го включва.
Получаваме този резултат, защото current_timestamp
функцията връща клеймо за време с часова зона тип данни.
Пример 5 – Използване на времеви стойности
timezone()
функцията работи и с time
стойности (time with time zone
и time without time zone
).
Въпреки това, когато го използвате в time with time zone
стойности, изместването на часовата зона се добавя към резултата.
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');
Резултат (с помощта на вертикален изход):
<предварителна>часова зона | 04:00:00+04часова зона | 03:00:00+04часова зона | 18:00:00+04
И за пълнота, ето същите тези стойности, използващи time without time zone
тип данни.
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');
Резултат (с помощта на вертикален изход):
<предварителна>часова зона | 18:00:00+04часова зона | 18:00:00+04часова зона | 18:00:00+04Проверете местната часова зона
Ако искате да проверите собствената си местна часова зона, стартирайте SHOW TIMEZONE
.
Ето какво получавам, когато изпълня тази команда.
SHOW TIMEZONE;
Резултат:
Австралия/Бризбейн
Проверете отместването на часовата зона
Въоръжен с горните познания, сега мога да проверя двете измествания на часовата зона, като задам pg_timezone_names
преглед.
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Резултат (с помощта на вертикален изход):
<предварително име | съкращение | utc_offset | is_dst--------------------+-------+------------+------ --Индийски/Мавриций | +04 | 04:00:00 | fАвстралия/Бризбейн | AEST | 10:00:00 | еВижте Връщане на списък с часови зони, поддържани от PostgreSQL за повече опции и примери за връщане на часовата зона в Postgres.