带时区的时间戳类型的无效输入语法

invalid input syntax for type timestamp with time zone

我正在尝试将具有不同小时间隔的时间戳动态插入到 Postgres (12.1)、NodeJS 10.15.3 和 Knex 中。

通过 Postico 直接插入 Postgres,NOW() + INTERVAL 'n hours' 格式工作正常:

insert into users (first_name, updated_at) 
values ('Bob', NOW() + INTERVAL '2 hours');

通过 Knex 插入时,

row.updated_at = `NOW() + INTERVAL '2 hours'`;

我遇到错误:

invalid input syntax for type timestamp with time zone: "NOW() + INTERVAL '2 hours'"

通过query.toString()输出查询,我看到区间已经转换为

'NOW() + INTERVAL ''2 hours'''

如何以正确的格式插入?

knex 正在将您的输入转换为 string 并将其传递给数据库,它希望 db 将其解析为有效的时间戳。为避免 knex 将您的输入用双引号引起来,您需要将其指定为文字值。方法是使用 raw

row.updated_at = knex.raw("NOW() + INTERVAL '2 hours'");

其中 knex 是您用来实例化与数据库的连接的变量。