SQL date_part возвращает местный часовой пояс вместо часового пояса в аргументе - PullRequest
0 голосов
/ 21 сентября 2018
SELECT date_part('timezone_hour', '2019-12-01 13:37:12 PST'::timestamptz) AS "tz"

и

SELECT date_part('timezone_hour', '2019-12-01 13:37:12 EST'::timestamptz) AS "tz"

оба возвращают -8, мое смещение GTM по местному тихоокеанскому времени в часах вместо часового пояса в аргументе функции.

То же поведениепроисходит для извлечения:

SELECT extract('timezone_hour' from '2019-12-01 13:37:12 PST'::timestamptz) AS "year"

и

SELECT extract('timezone_hour' from '2019-12-01 13:37:12 PST'::timestamptz) AS "year"

оба возвращают -8.

Почему я не получаю смещение часового пояса, которое я указал дляметки времени?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы поймете лучше, если посмотрите, как PostgreSQL отображает две метки времени:

SELECT TIMESTAMP WITH TIME ZONE '2019-12-01 13:37:12 PST';

      timestamptz       
------------------------
 2019-12-01 22:37:12+01
(1 row)

SELECT TIMESTAMP WITH TIME ZONE '2019-12-01 13:37:12 EST';

      timestamptz       
------------------------
 2019-12-01 19:37:12+01
(1 row)

В обоих случаях метка времени преобразуется в часовой пояс сеанса, как указано в конфигурации timezoneпараметр.

PostgreSQL не хранит информацию о часовом поясе в timestamp with time zone, он преобразует метку времени в UTC и сохраняет ее таким образом.При отображении метка времени преобразуется в текущий часовой пояс сеанса.

Так что timestamp with time zone лучше называть «абсолютной меткой времени» в PostgreSQL.Он точно представляет определенный момент времени, но без информации о часовом поясе.

Другими словами, если вы извлечете timezone_hour, вы всегда получите один и тот же результат: смещение часового пояса вашего текущего часового пояса сеанса..

0 голосов
/ 21 сентября 2018

Попробуйте это:

SELECT date_part('hour', '2019-12-01 13:37:12'::timestamp AT TIME ZONE 'PST') AS "tz";
SELECT date_part('hour', '2019-12-01 13:37:12'::timestamp AT TIME ZONE 'EST') AS "tz";
SELECT date_part('hour', '2019-12-01 13:37:12'::timestamp AT TIME ZONE 'AEST') AS "tz";

Они возвращают 22, 19 и 4 соответственно при rextester (postgres)

В вашем существующем подходе, если вы потянете "timezone_hour "это будет введенное вами значение (потому что это час в этом часовом поясе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...