Я использую последнюю структуру Zend для связи с базой данных PostgreSQL. В некоторых моих таблицах db есть поле now()
которое добавляет текущую временную метку. Тем не менее, часовой пояс соединения db может отличаться для разных запросов.
Можно ли установить часовой пояс для базы данных PostgreSQL для каждого соединения? Я знаю, что вы можете передавать параметры драйвера в экземпляр Zend_Db, поэтому я думаю, что есть трюк.
В SQL ,
SET TIMEZONE TO 'America/New_York';
Чтобы получить имена часовых поясов, используйте
SELECT * FROM pg_timezone_names;
Если ваши подключения происходят с разными ролями (логинами) базы данных, которые могут быть привязаны к часовому поясу , PostgreSQL предлагает простое решение:
ALTER ROLE my_role SET TIMEZONE = '+1';
Каждое соединение, инициированное этой ролью, будет работать в заданном часовом поясе автоматически (если не указано иное).
Обратите внимание, что, цитируя руководство :
Это происходит только во время входа в систему; выполнение
SET ROLE
илиSET SESSION AUTHORIZATION
не приводит к установке новых значений конфигурации.
И вы можете захотеть использовать имя часового пояса вместо простого смещения, чтобы следовать правилам DST и другим политическим манипуляциям по местному времени. Больше:
Кроме того , вы можете создать справочную таблицу для своих логинов, где вы храните соответствующие часовые пояса (которые могут служить дополнительными целями):
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
переменная (или столбец, как в приведенной выше функции), содержащая смещение, сокращение или имя часового пояса. Вы также можете напрямую предоставить строковый литерал.