web-dev-qa-db-fra.com

Comment passer un DateTime de NodeJS Sequelize à MSSQL

J'ai un projet NodeJS et j'essaye de passer un champ 'UpdateDate' en utilisant Sequelize. Je reçois l'erreur "La conversion a échoué lors de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères". J'ai essayé de passer quelques choses différentes:

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

Aucun travail. Suis-je en train de manquer quelque chose de simple? Je ne peux pas modifier la définition de colonne sur la table. Pour autant que je sache, le passage d'une chaîne telle que '2016-05-23 10: 39: 21.000' à un champ SQL DateTime fonctionne dans SSMS, mais cela semble être un problème lors de l'utilisation de Sequelize et Node.

Merci

Zach

11
Zach

Cela est dû à un problème conn dans Sequelize. La solution consiste à patcher la date de Sequelize sur l'implémentation du format de chaîne, comme expliqué ici , afin que toutes les dates soient gérées correctement. Voici le code qui corrige l'erreur.

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

J'ai compris cela, sans changer le type de données dans la base de données SQL.

Dans mon modèle, ma colonne était définie comme DataTypes.DATE, ce qui, selon la documentation Sequelize, est l'équivalent d'un DateTime en SQL. Cependant, cela renvoyait l'erreur. Lorsque j'ai changé la définition en DataTypes.STRING, puis ajouté ceci:

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

normalizedDate passe maintenant à la colonne DateTime dans SQL sans problème. Le problème que je peux dire, c'est que Sequelize ajoutait un fuseau horaire à la date avant de la passer. Tels que, une date comme:

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

était passé comme:

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

et il semble que le serveur SQL n'aime pas le '+00: 00'.

J'espère que cela aide les autres.

3
Zach