Postgres или Ruby добавляют часовой пояс к моему столбцу `timestamp без часового пояса`? - PullRequest
2 голосов
/ 03 мая 2011

Если я запрашиваю свою базу данных с помощью SELECT current_setting('TIMEZONE'), я получаю 'UTC' (как и ожидалось).

Используя PgAdmin, я запускаю следующий запрос:

SELECT foo FROM bar

PgAdmin показывает "2011-03-12 08:00:00 ".Однако, когда я читаю значение из Ruby (используя DataMapper , который использует драйвер JDBC 'org.postgresql.Driver', насколько мне известно ), оно показывает "2011-03-12 08:00:00-0700 ".

Вопрос: Где во всем стеке добавляется часовой пояс?Хотя я понимаю, что многое зависит от специфики моего стека, это действительно помогло бы понять, что должно произойти , чтобы я мог что-то исключить.Например, следует ли ожидать, что для столбца timestamp without time zone драйвер JDBC выдаст «сырое» значение без информации о часовом поясе?

Ответы [ 3 ]

2 голосов
/ 03 мая 2011

Что-то в Ruby делает настройку часового пояса:

psql=> select current_setting('timezone');
 current_setting
-----------------
 Canada/Pacific
(1 row)

psql=> select min(created_at) from people;
            min
----------------------------
 2010-07-09 13:58:51.320659
(1 row)

psql=> set timezone = 'utc';
psql=> select current_setting('timezone');
 current_setting
-----------------
 UTC
(1 row)

psql=> select min(created_at) from people;
            min
----------------------------
 2010-07-09 13:58:51.320659
(1 row)

Вы можете проверить это, выполнив необработанный SQL-запрос временной метки из Ruby и посмотрев, какую строку вы получите.

1 голос
/ 05 мая 2011

Драйвер JDBC при чтении метки времени без часового пояса делает смелое / разумное предположение, что эта метка времени выражена в часовом поясе JVM.

0 голосов
/ 11 июня 2015

Если вы не хотите, чтобы часовой пояс добавлялся, используйте тип «отметка времени без часового пояса». Таким образом, читатель всегда будет читать ту же секунду / час / минуту / день / месяц / год, которую вы вставили.

Я использовал следующую процедуру, чтобы воспроизвести это

create table t (
without_tz timestamp  without time zone ,
with_tz timestamp  with time zone 
)
SET SESSION TIME ZONE default;
insert into t VALUES ( now(), now() )
select * from t;
SET SESSION TIME ZONE PST8PDT;
insert into t VALUES ( now(), now() )
select * from t;
SET SESSION TIME ZONE PST6PDT;
insert into t VALUES ( now(), now() )
select * from t;

Наблюдая значения от избранных, я прихожу к выводу, что

  • отметка времени без часового пояса никогда не преобразуется. Вы читаете ту же секунду / час / минуту / день / месяц / год, что вы вставили, независимо от того, в каком часовом поясе вы находитесь.

    • метка времени с часовым поясом преобразует значения, которые вы прочитали, в ваш часовой пояс. они представляют одно и то же мгновение (момент времени), но значения часов (а иногда дней, иногда даже минут) будут разными.
...