MySQL数据库的ISO 8601时间戳:MySQL错误的date时间值

错误日志:

{[错误:错误的date时间值:'2012-08-24T17:29:11.683Z'列1'机器人_refreshed_at']数字:1292,sqlStateMarker:'#',sqlState:'22007',消息:'不正确datetime value:\'2012-08-24T17:29:11.683Z \'for'\'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 )值('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] [function]}

我在我的Node.js使用这段代码

  if s instanceof Date return s.toISOString() 

并在数据库中更新它们。

SQL插入expression式如下所示:

  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\') 

我做错了什么? 我刚刚从服务器中的表中使用PHPMyAdmin复制表。

非常感谢。

如date和时间文字所述 :

MySQL以这些格式识别DATETIMETIMESTAMP值:

  • 作为'YYYY-MM-DD HH:MM:SS''YY-MM-DD HH:MM:SS'格式的string。 这里也允许使用“宽松”的语法:任何标点字符都可以用作date部分或时间部分之间的分隔符。 例如, '2012-12-31 11:30:45''2012^12^31 11+30+45''2012/12/31 11*30*45''2012@12@31 11^30^45'是相同的。

  • 作为一个没有分隔符的string,如'YYYYMMDDHHMMSS''YYMMDDHHMMSS'格式,只要string是有意义的date。 例如, '20070523091528''070523091528'被解释为'2007-05-23 09:15:28' ,但是'071122129015'是非法的(它具有无意义的微小部分)并且变成'0000-00-00 00:00:00'

  • 作为YYYYMMDDHHMMSSYYMMDDHHMMSS格式的数字,条件是该数字作为date是有意义的。 例如, 19830905132800830905132800被解释为'1983-09-05 13:28:00'

DATETIMETIMESTAMP值可以包含以微秒(6位)为精度的尾随小数秒部分。 虽然这个小数部分是被识别的,但是从存储在DATETIMETIMESTAMP列中的值中被丢弃。 有关MySQL 中小数秒支持的信息,请参见第11.3.6节“小数秒的时间值” 。

你的date字面量'2012-08-24T17:29:11.683Z'不符合任何这些格式。 build议你要么 –

  • 请使用Node.js Date对象的toLocaleFormat()方法(确保MySQL连接的时区与Node.js的语言环境相匹配):

      if s instanceof Date return s.toLocaleFormat("%Y-%m-%d %H:%M:%S") 
  • 使用Node.js Date对象的valueOf()方法获取自UNIX纪元以来的时间值(以毫秒为单位) ,除以1000 (从UNIX纪元以来获得秒数 )并通过MySQL的FROM_UNIXTIME()函数。

我在这个链接上find它:

MySQL插入到DATETIME:使用ISO :: 8601格式安全吗?

看来插入一个ISO8601时间戳是不安全的。 这取决于MySQL的parsing器。 也许不同版本使用不同的方法。

 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 

这段代码可以为node.js提供格式化Date的能力