使用nodejs时,postgresql to_chardate,'day'得到不同的结果

问题描述

更新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("…");中即可。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...