Установить часовой пояс экземпляра PostgreSQL - PullRequest
5 голосов
/ 19 сентября 2011

Я использую новейшую платформу Zend для связи с базой данных PostgreSQL. Некоторые из моих таблиц БД имеют поле now(), которое добавляет текущую временную метку. Однако часовой пояс соединения с БД может быть разным для разных запросов.

Можно ли установить часовой пояс базы данных PostgreSQL для каждого соединения? Я знаю, что вы можете передать параметры драйвера экземпляру Zend_Db, так что я думаю, в этом и заключается хитрость.

Ответы [ 2 ]

6 голосов
/ 15 октября 2011

Если ваши соединения происходят с различными ролями базы данных (логинами), которые можно привязать к часовому поясу , то PostgreSQL предлагает простое решение:

ALTER ROLE my_role SET TIMEZONE = '+1';

Каждое соединение, инициированное с этой ролью, будет работать в заданном часовом поясе автоматически (если не указано иное).
Обратите внимание, что цитирует руководство :

Это происходит только во время входа в систему; выполнение SET ROLE или SET SESSION AUTHORIZATION не приводит к установке новых значений конфигурации.

И вы можете использовать имя часового пояса вместо простого смещения, чтобы следовать правилам летнего времени и другим политическим манипуляциям с местным временем. Подробнее:

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

CREATE TABLE usertime(username text primary key, timezone text);
-- careful, "user" is a reserved word (but "timezone" is not).
INSERT INTO usertime VALUES
   ('postgres', '+4')
  ,('my_role' , '+3');

Напишите крошечную функцию SQL:

CREATE FUNCTION f_user_ts()
  RETURNS timestamp AS
'SELECT now() AT TIME ZONE u.timezone
 FROM   usertime u
 WHERE  u.username = current_user
' LANGUAGE sql STABLE;

Теперь возвращается локальная метка времени для текущей роли (пользователя):

SELECT f_user_ts();

Подробнее

См. Подробное руководство по конструкции AT TIME ZONE. Оба эти синтаксических варианта действительны:

SET TIME ZONE TO 'UTC';
SET TIMEZONE TO 'UTC';

Но now() AT TIMEZONE foo; нет! Должно быть:

SELECT now() AT TIME ZONE foo;

foo - переменная text (или столбец, как в приведенной выше функции), содержащий смещение часового пояса, аббревиатуру или имя. Вы также можете указать строковый литерал напрямую.

6 голосов
/ 19 сентября 2011

В SQL ,

SET TIMEZONE TO 'America/New_York';

Чтобы получить названия часовых поясов, используйте

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