Intereting Posts

Установить часовой пояс экземпляра PostgreSQL

Я использую последнюю структуру Zend для связи с базой данных PostgreSQL. В некоторых моих таблицах db есть поле now() которое добавляет текущую временную метку. Тем не менее, часовой пояс соединения db может отличаться для разных запросов.

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

Related of "Установить часовой пояс экземпляра PostgreSQL"

В 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 и другим политическим манипуляциям по местному времени. Больше:

  • Игнорирование часовых поясов в Rails и PostgreSQL

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

 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; 

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