问题描述
更新2
使用@Bergi的建议,我添加了一个数据库执行助手来设置执行查询之前的时区。这使我可以根据登录用户的首选项来控制时区。
async function execWithTZ(sql,params,timezone) {
const client = await this.pool.connect();
await client.query<any>(`SET TIMEZONE TO '${timezone}'`,[]);
return client.query<any>(sql,params);
}
const result = await execWithTZ('SELECT ...',[],'Australia/Sydney');
问题
我试图让Postgresql返回视图中特定日期的星期几。稍后,我将用它来按天显示值。
数据位于表中,该表包含名为updated
的列,列为timestamptz
。
当使用DBeaver sql客户端对Postgresql 12数据库运行以下查询时,我得到了我期望的值,并且在本地时间(星期四午夜之后)更新的记录显示为星期四
SELECT
count(v.id) AS count,btrim(to_char(v.updated,'DAY'::text)) AS day,date_trunc('DAY'::text,v.updated) AS "updatedDay"
FROM table v
GROUP BY (to_char(v.updated,'DAY'::text)),(date_trunc('DAY'::text,v.updated))
我将其放在视图中,当我使用node-postgres
查询该视图时,计数是针对前一天(星期三)的,因为数据库认为它应解释UTC时区中的日期。
为了进一步说明这一点,当我在DBeaver中将上述查询更改为使用DAYTZ
而不是DAY
时,我得到了THURSDAYAEST
,但是在nodejs中却得到了{{1} }
将所有日期都设置为没有时区,并且在进入过程中将所有内容强制设置为UTC并不是我的选择。
如何使WednESDAYUTC
告诉数据库我希望这些日期解释为哪个时区,以便获得正确的日期?
更新1
我设法通过设置数据库用户的时区来使Postgresql返回正确的值到node-postgres
。
postgres node
现在,悉尼时间星期四发生的事情的计数是星期四而不是星期三。
解决方法
仍然对在连接而不是数据库用户级别上执行此操作的方式感兴趣。
您已经找到the right setting,没有理由仅在角色上进行更改。您也可以通过运行change the setting
在客户端会话中SET
command
SET TIMEZONE TO 'Australia/Sydney';
只需在连接客户端后将其放在pgClient.query("…");
中即可。