设置PostgreSQL实例的时区

时间:2011-09-19 14:26:21

标签: php zend-framework postgresql timezone

我正在使用最新的Zend框架与PostgreSQL数据库进行通信。我的一些数据库表有一个now()字段,用于添加当前时间戳。但是,对于不同的请求,db连接的时区可能不同。

是否可以基于每个连接设置PostgreSQL数据库的时区?我知道你可以将驱动程序选项传递给Zend_Db的实例,所以我觉得有诀窍。

3 个答案:

答案 0 :(得分:6)

SQL

SET TIMEZONE TO 'America/New_York';

要获取时区的名称,请使用

SELECT * 
FROM pg_timezone_names;

答案 1 :(得分:6)

如果您的连接发生在可以绑定到时区的不同数据库角色(登录)上,那么PostgreSQL提供了一个简单的解决方案:

ALTER ROLE my_role SET TIMEZONE = '+1';

使用此角色启动的每个连接都将自动在其预设时区内运行(除非另有说明) 请注意,quoting the manual

  

这只发生在登录时;执行SET ROLESET 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;

footext变量(或上述函数中的列),包含时区偏移量,缩写或名称。您也可以直接提供字符串文字。

答案 2 :(得分:0)

只是一个远景,但如果您设置您正在使用的角色的时区怎么办?

ALTER ROLE my_db_user IN DATABASE my_database
    SET "TimeZone" TO 'UTC';