2012-08-24 48 views
5

registro de error:ISO 8601 Marca de tiempo para la base de datos MySQL: MySQL valor de fecha y hora incorrecta

{ [Error: Incorrect datetime value: '2012-08-24T17:29:11.683Z' for column 'robot _refreshed_at' at row 1] number: 1292, sqlStateMarker: '#', sqlState: '22007', message: 'Incorrect datetime value: \'2012-08-24T17:29:11.683Z\' for column \' robot_refreshed_at\' at row 1', sql: 'INSERT INTO users (id,name,count_moments,count_likes,count_followers,rob ot_refreshed_at,robot_count_followers) VALUES (\'1834084\',\'NNNyingzi\',\'5\',\ '0\',\'0\',\'2012-08-24T17:29:11.683Z\',\'0\')', setMaxListeners: [Function], emit: [Function], addListener: [Function], on: [Function], once: [Function], removeListener: [Function], removeAllListeners: [Function], listeners: [Function] }

utilizo este fragmento de código en mi Node.js

if s instanceof Date 
     return s.toISOString() 

y actualizados en la base de datos.

La expresión SQL inserción siguiente:

 INSERT INTO users (id,name,count_moments,count_likes,count_followers,rob ot_refreshed_at,robot_count_followers) VALUES (\'1834084\',\'NNNyingzi\',\'5\',\ '0\',\'0\',\'2012-08-24T17:29:11.683Z\',\'0\') 

¿Estoy haciendo algo mal? Acabo de copiar una tabla usando PHPMyAdmin desde una tabla en el servidor.

Muchas gracias.

Respuesta

9

como se indica en Date and Time Literals:

MySQL recognizes DATETIME and TIMESTAMP values in these formats:

  • As a string in either 'YYYY-MM-DD HH:MM:SS' or 'YY-MM-DD HH:MM:SS' format. A “relaxed” syntax is permitted here, too: Any punctuation character may be used as the delimiter between date parts or time parts. For example, '2012-12-31 11:30:45' , '2012^12^31 11+30+45' , '2012/12/31 11*30*45' , and '[email protected]@31 11^30^45' are equivalent.

  • As a string with no delimiters in either 'YYYYMMDDHHMMSS' or 'YYMMDDHHMMSS' format, provided that the string makes sense as a date. For example, '20070523091528' and '070523091528' are interpreted as '2007-05-23 09:15:28' , but '071122129015' is illegal (it has a nonsensical minute part) and becomes '0000-00-00 00:00:00' .

  • As a number in either YYYYMMDDHHMMSS or YYMMDDHHMMSS format, provided that the number makes sense as a date. For example, 19830905132800 and 830905132800 are interpreted as '1983-09-05 13:28:00' .

A DATETIME or TIMESTAMP value can include a trailing fractional seconds part in up to microseconds (6 digits) precision. Although this fractional part is recognized, it is discarded from values stored into DATETIME or TIMESTAMP columns. For information about fractional seconds support in MySQL, see Section 11.3.6, “Fractional Seconds in Time Values” .

Su fecha literal de '2012-08-24T17:29:11.683Z' no adaptado a cualquiera de estos formatos; te sugeriría o —

  • uso en lugar toLocaleFormat() método de la Fecha de objeto Node.js (asegúrese de que la zona horaria de la conexión MySQL coincide con el de la configuración regional del Node.js):

    if s instanceof Date 
         return s.toLocaleFormat("%Y-%m-%d %H:%M:%S") 
    
  • utilizar el método Node.js Fecha del objeto valueOf() para obtener el valor del tiempo en milisegundos desde la época UNIX, se divide por 1000 (para obtener segundos desde la época UNIX) y pasar a través de Mi Función de SQL FROM_UNIXTIME().

+0

ha cambiado con diferentes versiones de 'MySQL'? Estoy seguro de que en el servidor donde copié la tabla se está ejecutando correctamente. –

+0

@ComboZhc: No que yo sepa. Quizás PHPMyAdmin formatea la salida para su visualización de esa manera, pero el formato no es un literal de fecha y hora MySQL válido. Puede usar ['STR_TO_DATE()'] (http://dev.mysql.com/doc//en/date-and-time-functions.html#function_str-to-date) para realizar conversiones, si es necesario. – eggyal

+0

Si tiene problemas para configurar las fechas con millis y/o microsegundos, puede deshabilitar el modo estricto de mysql (establecer sql_mode = '') – momo

2

lo encuentro en este enlace:

MySQL insert to DATETIME: is it safe to use ISO::8601 format?

Parece que la inserción de una marca de tiempo ISO8601 no es seguro. Depende del analizador de MySQL. Tal vez diferentes versiones usan diferentes métodos.

Date.prototype.format = (format) -> 
    o = { 
    "(M+)" : this.getMonth()+1, 
    "(d+)" : this.getDate(), 
    "(h+)" : this.getHours(), 
    "(m+)" : this.getMinutes(), 
    "(s+)" : this.getSeconds(), 
    "(q+)" : Math.floor((this.getMonth()+3)/3), 
    "(S)" : this.getMilliseconds() 
    } 
    if /(y+)/.test(format) 
    format = format.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length)) 
    for k, v of o 
    if (new RegExp(k)).test(format) 
     format = format.replace(RegExp.$1, if RegExp.$1.length == 1 then o[k] else ('00'+ o[k]).substr((''+ o[k]).length)) 
    return format 

Este código pieza podría proporcionar node.js con la capacidad de dar formato a un Date

Cuestiones relacionadas