我正在使用最新的Zend框架与PostgreSQL数据库进行通信。我的一些数据库表有一个now()
字段,用于添加当前时间戳。但是,对于不同的请求,db连接的时区可能不同。
是否可以基于每个连接设置PostgreSQL数据库的时区?我知道你可以将驱动程序选项传递给Zend_Db的实例,所以我觉得有诀窍。
答案 0 :(得分:6)
答案 1 :(得分:6)
如果您的连接发生在可以绑定到时区的不同数据库角色(登录)上,那么PostgreSQL提供了一个简单的解决方案:
ALTER ROLE my_role SET TIMEZONE = '+1';
使用此角色启动的每个连接都将自动在其预设时区内运行(除非另有说明) 请注意,quoting the manual:
这只发生在登录时;执行
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
变量(或上述函数中的列),包含时区偏移量,缩写或名称。您也可以直接提供字符串文字。
答案 2 :(得分:0)
只是一个远景,但如果您设置您正在使用的角色的时区怎么办?
ALTER ROLE my_db_user IN DATABASE my_database
SET "TimeZone" TO 'UTC';