Knex NodeJS 在 PostgreSQL 中插入兼容的日期时区
Knex NodeJS insert date timezone compatible inside PostgreSQL
我有一个像这样的 postgreSQL table:
table.string('id');
table.string('name');
table.specificType('data', 'JSONB');
table.timestamp('runDate');
table.boolean('done').default(false);
我想知道在数据库中插入日期时间的安全方法是什么。
我就是这样做的:
await _i_.knex("jobs")
.transacting(ctx ? ctx.transaction : null)
.insert({
id: job.id,
name: job.name,
data: job.data,
id: job.id,
runDate: job.runDate,
done: false
});
当我想查询我的 table 时,我使用:
return await _i_.knex('jobs')
.transacting(ctx ? ctx.transaction : null)
.whereRaw('"runDate" < NOW()')
.andWhere('done', false)
.returning("*")
.update({
done: true
});
所以如果我的 nodeJS 服务器没有我的 PostgreSQL 的保存时区,我可能会遇到时区问题。
你是怎么做到的?
如何在插入时使用数据库时间:...runDate: knex.raw("NOW()")
...
然后存储和检索日期将同步到同一时区。
但是如果 job.runDate
需要毫秒精度,或者记录在存储之前已经保存了很长时间,那么这就不合适了。
默认 knex
creates timestamp with time zone
(timestamptz
) type for .timestamp()
columns for PostgreSQL. So, your date and time are stored with timezone. For inserting timestamp values I like to use moment
package.
const moment = require('moment');
const dateStr = moment().utc().format();
console.log(dateStr); // => Date in format 'YYYY-MM-DDTHH:mm:ssZ'
knex.insert({ runDate: dateStr })
我有一个像这样的 postgreSQL table:
table.string('id');
table.string('name');
table.specificType('data', 'JSONB');
table.timestamp('runDate');
table.boolean('done').default(false);
我想知道在数据库中插入日期时间的安全方法是什么。
我就是这样做的:
await _i_.knex("jobs")
.transacting(ctx ? ctx.transaction : null)
.insert({
id: job.id,
name: job.name,
data: job.data,
id: job.id,
runDate: job.runDate,
done: false
});
当我想查询我的 table 时,我使用:
return await _i_.knex('jobs')
.transacting(ctx ? ctx.transaction : null)
.whereRaw('"runDate" < NOW()')
.andWhere('done', false)
.returning("*")
.update({
done: true
});
所以如果我的 nodeJS 服务器没有我的 PostgreSQL 的保存时区,我可能会遇到时区问题。
你是怎么做到的?
如何在插入时使用数据库时间:...runDate: knex.raw("NOW()")
...
然后存储和检索日期将同步到同一时区。
但是如果 job.runDate
需要毫秒精度,或者记录在存储之前已经保存了很长时间,那么这就不合适了。
默认 knex
creates timestamp with time zone
(timestamptz
) type for .timestamp()
columns for PostgreSQL. So, your date and time are stored with timezone. For inserting timestamp values I like to use moment
package.
const moment = require('moment');
const dateStr = moment().utc().format();
console.log(dateStr); // => Date in format 'YYYY-MM-DDTHH:mm:ssZ'
knex.insert({ runDate: dateStr })