NodeJS 如何避免moment.js转换日期

km0tfn4u  于 2022-12-12  发布在  Node.js
关注(0)|答案(1)|浏览(168)

我有一个node.js程序,它使用oracledb包。
它连接到Oracle数据库,选择数据并将该数据存储到另一个Oracle数据库中。
两个数据库都配置为使用UTC来存储日期/时间值
下面是一个代码片段:

let sql = `SELECT a.* FROM some_view a`;
const result = await db1.execute(sql, {}, {
  outFormat: oracledb.OUT_FORMAT_OBJECT
});
const workOrders= result.rows as WorkOrder[];

...

for (const workOrder of workOrders) {
  await db2.execute(
    `INSERT INTO table(workordernumber, startdate)
     VALUES (:workordernumber, :startdate)`, {
    workordernumber: workOrder.workordernumber,
    startdate: startdate
  },
);

问题是日期/时间值在存储到目标系统时被转换为我的本地时区。
我在EST中。因此,来自源的09/07/2022 17:04:08在目标中存储为09/07/2022 22:04:08。
我已经尝试使用moment来阻止目标上的转换,但没有成功,如下所示:

INSERT INTO table(workordernumber, startdate)
VALUES (:workordernumber, :startdate), {
  workordernumber: workOrder.workordernumber,
  startdate: moment.utc(startdate)
},

这些值仍然转换为我的本地时区。
我想从一个数据库中获取UTC值,并将它们作为UTC值存储在另一个数据库中,而不进行任何转换。
有什么建议吗?

5sxhfpxr

5sxhfpxr1#

我必须在两个数据库中创建以下LOGON触发器,它将会话时区设置为UTC。这将阻止node-oracledb驱动程序转换该值。请确保将其创建为Sys,以便它是每个登录用户的触发器。

CREATE OR REPLACE TRIGGER “SYS”.after_logon_trg
  AFTER LOGON ON SCHEMA
BEGIN
  EXECUTE IMMEDIATE 'ALTER SESSION SET TIME_ZONE = ''+00:00''';
END;
/

相关问题