postgresql to_char(date, 'day') 在使用 nodejs 时得到不同的结果

postgresql to_char(date, 'day') get different result when using nodejs

更新 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 return 视图中特定日期的星期几。我后来用它来按天显示值。

数据位于 table 中,其中有一列名为 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 中的日期时区。

为了进一步证明这一点,当我将上面的查询更改为使用 DAYTZ 而不是仅在 DBeaver 中使用 DAY 时,我得到 THURSDAYAEST 但在 nodejs 中我得到 WEDNESDAYUTC

将我的所有日​​期更改为不带时区并在进入途中强制所有内容使用 UTC 对我来说不是一个选项。

如何让 node-postgres 告诉数据库我希望将这些日期解释为哪个时区,以便我可以获得正确的日期?

更新 1

通过设置数据库用户的时区,我设法让 PostgreSQL 到 return 正确的值 postgres node

ALTER ROLE visuo_ingest SET TIMEZONE TO 'Australia/Sydney';

现在悉尼时间星期四发生的事情的计数是星期四而不是星期三。

仍然对在连接而不是数据库用户级别执行此操作感兴趣。

Still interested in a way to do this on the connection rather than the database user level.

您已经找到the right setting, there's no reason to alter it on a role only. You can also change the setting in a client session by running the SET command

SET TIMEZONE TO 'Australia/Sydney';

只需在连接客户端后将其放入 pgClient.query("…"); 即可。