2014-09-25 9 views
19
//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)... 

Questo è l'errore che ottengo dopo l'inserimento, nota colonna in Mysql è un tipo "datetime".Come inserire l'istante momento JS in MySQL

MySQL Error:: { [Error: ER_TRUNCATED_WRONG_VALUE: Incorrect datetime value: '2014-09- 24T04:09:00.000Z' for column '_dateColumn' at row 1] code: 'ER_TRUNCATED_WRONG_VALUE',

+0

Quale tipo di dati della colonna è? – DontVoteMeDown

+0

in Mysql, la colonna è di tipo "datetime". – user1529412

risposta

42

Questo risultato accade perché si sta utilizzando il metodo toISOString() e non è un formato valido da inserire nella colonna DATETIME. Il formato corretto probabilmente è YYYY-MM-DD HH:MM:SS (penso che dipenda dalla configurazione di MySQL, ma questo è l'impostazione predefinita) come indicato dallo docs.

Così si dovrebbe provare a utilizzare il metodo di momento format() come questo:

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

In realtà, io non so cosa data.myTime è, ma se un oggetto momento troppo, è possibile modificare il primo metodo format() e rimuovere il secondo.

+0

La linea che ha dato a me mi sta dando un oggetto: {_isAMomentObject: vero, _I: '2014/09/24', _F: undefined, _L: undefined, _strict: undefined, _isUTC: false, _pf : {vuoto: false, unusedTokens: [], unusedInput: [], overflow: -2, charsLeftOver: 0, nullInput: false, invalidMonth: nullo, invalidFormat: false, userInvalidated: false, iso: false}, _d: mer 24 set 2014 00:00:00 GMT-0400 (EDT), _is Valido: true} – user1529412

+0

@ user1529412 beh, dovrebbe restituire una stringa. – DontVoteMeDown

+0

Si noti che i miei dati originali.myTime è un oggetto stesso simili: {_isAMomentObject: vero, _i: '2014/09/24', _f: indefinito, _l: indefinito, _strict: indefinito, _isUTC: false, _pf: {vuoto : falsi, unusedTokens: [], unusedInput: [], overflow: -2, charsLeftOver: 0, nullInput: false, invalidMonth: nullo, invalidFormat: false, userInvalidated: false, iso: false }, _d: Mer 24 set 2014 00:00:00 GMT-0400 (EDT)} – user1529412

18

DontVoteMeDown answer è giusto, se non che i minuti 'mm' e secondi 'ss' necessità di essere in minuscolo, altrimenti un valore errato viene restituito:

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

Inoltre, si dovrebbe verificare il valore inviato dal javascript, prima di fare la vostra query SQL, in PHP:

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

tornerà false se è misformatted la data.

1

Penso che questo sia il formato corretto. In caso contrario, si ottengono i mesi inserita nel minuti, e si ottiene anche secondi sopra 60.

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

Testato in Chrome con Moment.js 2.9.0

2

Per generare datetime formato MySQL è possibile utilizzare questo:

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 
0
moment().format("YYYY-MM-DD HH:mm:ss")