web-dev-qa-db-ja.com

NodeJS SequelizeからMSSQLにDateTimeを渡す方法

NodeJSプロジェクトがあり、Sequelizeを使用して 'UpdateDate'フィールドを渡そうとしています。 「文字列から日付や時刻を変換するときに変換に失敗しました」というエラーが表示されます。私はいくつかの異なるものを渡そうとしました:

Date.now()
new Date().toISOString()

どちらも機能しません。簡単なものがないですか?テーブルの列定義を変更できません。私の知る限り、「2016-05-23 10:39:21.000」などの文字列をSQL DateTimeフィールドに渡すとSSMSで機能しますが、SequelizeとNodeを使用している場合は問題があるようです。

ありがとう

ザック

11
Zach

これは、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');
};
8
Brent Matzelle

SQLデータベースのデータ型を変更せずに、これを理解しました。

私のモデルでは、列をDataTypes.DATEとして定義しました。これは、Sequelizeのドキュメントによれば、SQLのDateTimeに相当します。ただし、これはエラーをスローしていました。定義をDataTypes.STRINGに変更してから、これを追加した場合:

var normalizedDate = new Date(Date.now()).toISOString();

normalDateは、SQLのDateTime列に問題なくパススルーするようになりました。私が言える問題は、Sequelizeが日付を渡す前に日付にタイムゾーンを追加していたことです。次のような日付など:

'2017-11-01 16:00:49.349'

次のように通過されました:

'2017-11-01 16:00:49.349 +00:00'

sQLサーバーは '+00:00'を好まないようです。

これが他の人の役に立つことを願っています。

3
Zach