Если ваши соединения происходят с различными ролями базы данных (логинами), которые можно привязать к часовому поясу , то 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
(или столбец, как в приведенной выше функции), содержащий смещение часового пояса, аббревиатуру или имя. Вы также можете указать строковый литерал напрямую.