web-dev-qa-db-fra.com

Comment insérer un moment JS dans MySQL

//In Node/JS
myDate = moment(data.myTime.format('YYYY/MM/DD HH:MM:SS')).toISOString();
//myDate shows '2014-09-24T04:09:00.000Z'

Insert INTO (dateColumn..) Values(myDate)...

C'est l'erreur que j'obtiens après l'insertion, notez que la colonne dans Mysql est un type "datetime".

Erreur MySQL :: {[Erreur: ER_TRUNCATED_WRONG_VALUE: valeur de date/heure incorrecte: '2014-09-24T04: 09: 00.000Z' pour la colonne '_dateColumn' à la ligne 1] code: 'ER_TRUNCATED_WRONG_VALUE',

27
user1529412

Ce résultat est dû au fait que vous utilisez la méthode toISOString() et que ce n'est pas un format valide à insérer dans votre colonne DATETIME. Le format correct probablement est YYYY-MM-DD HH:MM:SS (je pense que cela dépend de la configuration de MySQL, mais c'est la valeur par défaut), comme le souligne docs

Donc, vous devriez essayer d'utiliser la méthode moment format () comme ceci:

myDate =  moment(data.myTime.format('YYYY/MM/DD HH:mm:ss')).format("YYYY-MM-DD HH:mm:ss");

En fait, je ne sais pas ce que data.myTime est, mais si c'est aussi un objet moment, vous pouvez changer la première méthode format() et supprimer la seconde.

49
DontVoteMeDown

DontVoteMeDown answer a raison, sauf que les minutes 'mm' et secondes 'ss' doivent être en minuscules, sinon une valeur incorrecte est renvoyée:

myDate =  moment(new Date()).format("YYYY-MM-DD HH:mm:ss");

Aussi, vous devriez vérifier la valeur envoyée par javascript avant de faire votre requête SQL, en PHP:

DateTime::createFromFormat('Y-m-d H:i:s', $myDate);

Retournera false si la date est mal formatée.

22
Sheraf

Pour générer le format de date mysql, vous pouvez utiliser ceci:

var moment = require('moment');
let currentTimestamp = moment().unix();//in seconds
let currentDatetime = moment(currentTimestamp*1000).format("YYYY-MM-DD HH:mm:ss");//mysql datetime.
currentTimestamp = moment(currentDatetime).valueOf();//current timestamp in milliseconds
4
Salar

(Je travaille avec Node.js, Express et MySql et cela a fonctionné pour moi :)

var momentDate=new moment('2018-08-31T20:13:00.000Z');
var readyToInsert=momentDate.format("YYYY-MM-DD HH:mm:ss");

2
jlizanab
moment().format("YYYY-MM-DD HH:mm:ss")
2
Ashutosh Jha

Je pense que c'est le bon format. Sinon, vous insérez les mois dans vos minutes et vous obtenez également des secondes supérieures à 60.

myDate =  moment(data.myTime.format('YYYY/MM/DD HH:MM:ss')).format("YYYY-MM-DD HH:MM:SS");

Testé dans Chrome avec Moment.js 2.9.0

1
Carlos

Voici une extension de fonction pour le formater au format MySQL DateTime

moment.prototype.toMySqlDateTime = function () {
    return this.format('YYYY-MM-DD HH:mm:ss');
};

Vous pourrez faire: moment().toMySqlDateTime();

0
Yani