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