如何将DateJ从NodeJS Sequelize传递给MSSQL

Zac*_*ach 10 javascript sql-server datetime node.js sequelize.js

我有一个NodeJS项目,我正在尝试使用Sequelize传递'UpdateDate'字段.我收到错误'从字符串转换日期和/或时间时转换失败'.我试过传递一些不同的东西:

Date.now()
new Date().toISOString()
Run Code Online (Sandbox Code Playgroud)

都没有工作.我错过了一些简单的事吗?我无法更改表上的列定义.据我所知,将诸如"2016-05-23 10:39:21.000"之类的字符串传递给SQL DateTime字段在SSMS中工作,但在使用Sequelize和Node时似乎是一个问题.

谢谢

扎克

Bre*_*lle 8

这是由Sequelize中的一个已知问题引起的.解决方案是将Sequelize的日期修改为字符串格式实现,如此处所述,以便正确处理所有日期.下面是修复错误的代码.

const Sequelize = require('sequelize');

// Override timezone formatting for MSSQL
Sequelize.DATE.prototype._stringify = function _stringify(date, options) {
  return this._applyTimezone(date, options).format('YYYY-MM-DD HH:mm:ss.SSS');
};
Run Code Online (Sandbox Code Playgroud)

  • 这很好用,只需在调用 `new Sequelize(...)` 之前实例化覆盖 (3认同)

Zac*_*ach 7

我想通了这一点,而无需更改 SQL 数据库中的数据类型。

在我的模型中,我将我的列定义为 DataTypes.DATE,根据 Sequelize 文档,它相当于 SQL 中的 DateTime。但是,这是抛出错误。当我将定义更改为 DataTypes.STRING,然后添加以下内容时:

var normalizedDate = new Date(Date.now()).toISOString();
Run Code Online (Sandbox Code Playgroud)

normalizedDate 现在可以毫无问题地传递到 SQL 中的 DateTime 列。我可以说的问题是,Sequelize 在传递 Date 之前向它添加了一个时区。例如,像这样的日期:

'2017-11-01 16:00:49.349'
Run Code Online (Sandbox Code Playgroud)

被传递为:

'2017-11-01 16:00:49.349 +00:00'
Run Code Online (Sandbox Code Playgroud)

并且看起来 SQL 服务器不喜欢“+00:00”。

我希望这对其他人有帮助。