Chr*_*n-G 5 php postgresql timezone zend-framework
我使用最新的Zend框架与PostgreSQL数据库进行通信.我的一些数据库表有一个now()添加当前时间戳的字段.但是,对于不同的请求,db连接的时区可能不同.
是否可以在每个连接的基础上设置PostgreSQL数据库的时区?我知道你可以将驱动程序选项传递给Zend_Db的实例,所以我认为这就是诀窍.
在SQL中,
SET TIMEZONE TO 'America/New_York';
Run Code Online (Sandbox Code Playgroud)
要获取时区的名称,请使用
SELECT *
FROM pg_timezone_names;
Run Code Online (Sandbox Code Playgroud)
如果您的连接发生在可以绑定到时区的不同数据库角色(登录)上,那么PostgreSQL提供了一个简单的解决方案:
ALTER ROLE my_role SET TIMEZONE = '+1';
Run Code Online (Sandbox Code Playgroud)
使用此角色启动的每个连接都将自动在其预设时区内运行(除非另有说明).
请注意,引用手册:
这只发生在登录时; 执行
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');
Run Code Online (Sandbox Code Playgroud)
写一个小的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;
Run Code Online (Sandbox Code Playgroud)
现在,这将返回当前角色(用户)的本地时间戳:
SELECT f_user_ts();
Run Code Online (Sandbox Code Playgroud)
请参阅AT TIME ZONE构造的精细手册.这两种语法变体都是有效的:
SET TIME ZONE TO 'UTC';
SET TIMEZONE TO 'UTC';
Run Code Online (Sandbox Code Playgroud)
但不是!它一定要是:now() AT TIMEZONE foo;
SELECT now() AT TIME ZONE foo;
Run Code Online (Sandbox Code Playgroud)
foo是一个text变量(或上面函数中的列),它包含一个时区偏移量,缩写或名称.您还可以直接提供字符串文字.