Укажите часовой пояс для использования в качестве базового часового пояса. - PullRequest
1 голос
/ 06 января 2012

Исходя из первых двух ответов, вопрос был неясен в том виде, в котором он был изначально опубликован, поэтому я полностью переписываю его:

Следующий вопрос касается только того, как и какие данные хранятсяи никоим образом не является формой или формой, связанной с преобразованием данных при извлечении.Таким образом, преобразование в SELECT в нужный часовой пояс не является подходящим ответом.

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

То есть временная метка, вставленная как 2012-01-01 00:00:00+00:00, извлекается как 2011-12-31 19:00:00-05, где местный часовой пояс базы данных во времявставка была -05.Метки времени, которые были вставлены во время перехода на летнее время, когда база данных была на -04, возвращаются с использованием часового пояса -04.

Я хочу, чтобы все метки времени использовали произвольный часовой пояс при сохранении (и, таким образом, все могут быть найдены без какой-либо дополнительной работы, как с этим часовым поясом).То есть, если бы сервер вращался вокруг планеты, все время было бы на +00:00 (произвольный часовой пояс) вместо -12:00 до +12:00.

Могу ли я вставить временную метку со временемстолбец зоны такой, что все временные метки хранятся относительно произвольного часового пояса?Если да, то как?


Оригинал следует.

При вставке значения в поле timestamp with time zone оно преобразуется в текущий часовой пояс сервера.

Пример: если я вставлю значение с указанием часового пояса -1, при его извлечении будет возвращено время на -5 (часовой пояс сервера на момент его вставки).

IsМожно ли указать, что оно должно храниться с использованием произвольного часового пояса?

Примечание. Этот вопрос не в том, как преобразовать возвращенное время в другой часовой пояс, это зависит от того, как хранится время.

Ответы [ 4 ]

1 голос
/ 06 января 2012

При вставке значения в поле timestamp with time zone в действительности происходит преобразование временной метки в UTC. Другое дело, вообще, в какой часовой пояс это значение преобразуется на выходе. Есть несколько способов контролировать это:

Когда выводится временная метка со значением часового пояса, она всегда конвертируется из UTC в текущий часовой пояс и отображается как местное время в этой зоне. Чтобы увидеть время в другом часовом поясе, либо изменить часовой пояс или использовать конструкцию AT TIME ZONE (см. раздел 9.9.3 ).

1 голос
/ 07 января 2012

Вы должны сохранить смещение часового пояса дополнительно к timestamp.

Как уже объяснил @Milen (и связан с руководством ): timestamp сохраняет только момент времени (как абстрактное значение).Модификатор часового пояса не сохранен, он служит только для настройки timestamp относительно UTC.

Рассмотрим следующую демонстрацию:

-- DROP TABLE tbl;
CREATE TEMP TABLE tbl (id int, myts timestamptz, mytz interval);

INSERT INTO tbl VALUES
 (1, now()                , EXTRACT (timezone from now()) * interval '1s')
,(2, '2012-01-01 00:00-05', interval '-5h')
,(3, '2012-01-01 00:00+04', interval '4h')
,(4, '2012-11-11 20:30+03', interval '3h');

SELECT *
      ,(myts AT TIME ZONE mytz)::text
       || CASE WHEN mytz > '0:0' THEN '+' ELSE '' END
       || to_char(mytz, 'FMHH24:mi') AS timestamp_at_origin
FROM tbl;

Выполнитьэто локально увидеть.Обратите особое внимание на детали конструкции AT TIME ZONE и на то, как я извлекаю часовой пояс из (local!) timestamp with time zone.
now() return timestamp with time zone или timestamptz для краткости.

EXTRACT (timezone from now()) * interval '1s'

timestamp_at_origin отображает метку времени с часовым поясом, как видно в его начале.Если я понял ваш вопрос, то это то, что вы ищете.
Вы можете еще больше улучшить форматирование.

Возможно, вас заинтересует этот связанный вопрос , который проливает некоторый свет наНеясности и подводные камни часовых поясов.

0 голосов
/ 21 марта 2012

Я всегда сохраняю время по Гринвичу, чтобы клиент мог конвертировать на основе его текущего смещения по Гринвичу (оффлайн по Гринвичу доступен на большинстве языков).

Я пишу на C # - так что я могу легко конвертировать все объекты DateTimeпо Гринвичу, используя DateTime.ToUniversalTime(), поскольку я храню данные в базе данных.

Я не уверен, какой язык вы используете или как конвертировать все время в GMT в postgressql, но с логической точки зрения - запоминать все время вGMT разрешит единый часовой пояс, к которому легко могут относиться все остальные часовые пояса.

Надеюсь, это поможет!

Среднее время по Гринвичу

0 голосов
/ 06 января 2012

Вы можете сделать свой выбор с оператором at time zone:

select insertTs at time zone 'CST' from table

Подробнее здесь .

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