8

错误日志:

{ [错误:不正确的日期时间值:'2012-08-24T17:29:11.683Z' 列 'robot _refreshed_at' 在第 1 行] 编号:1292,sqlStateMarker:'#',sqlState:'22007',消息:'不正确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: [功能] }

我在我的Node.js

  if s instanceof Date
         return s.toISOString()

并在数据库中更新它们。

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

我做错什么了吗?我只是从服务器中的表中复制了PHPMyAdmin一个表。

非常感谢。

4

2 回答 2

15

日期和时间文字中所述:

MySQL以这些格式识别DATETIME和重视:TIMESTAMP

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

  • 作为在任何一种格式中都没有分隔符的'YYYYMMDDHHMMSS'字符串'YYMMDDHHMMSS',前提是该字符串作为日期有意义。例如,'20070523091528'and'070523091528'被解释为'2007-05-23 09:15:28', 但是'071122129015'是非法的(它有一个无意义的微小部分)并且变成'0000-00-00 00:00:00'.

  • 作为任一YYYYMMDDHHMMSS格式YYMMDDHHMMSS的数字,前提是该数字作为日期有意义。例如19830905132800830905132800被解释为'1983-09-05 13:28:00'

一个DATETIMETIMESTAMP值可以包括一个尾随小数秒部分,精度高达微秒(6 位)。尽管可以识别此小数部分,但它会从存储到DATETIMEorTIMESTAMP列中的值中丢弃。有关 MySQL 中小数秒支持的信息,请参阅第 11.3.6 节,“时间值中的小数秒”</a>。

您的日期文字'2012-08-24T17:29:11.683Z'不符合任何这些格式;建议你——

  • 改用 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()函数。

于 2012-08-24T17:42:59.910 回答
2

我在这个链接上找到它:

MySQL 插入 DATETIME:使用 ISO::8601 格式是否安全?

插入 ISO8601 时间戳似乎并不安全。这取决于MySQL. 也许不同的版本使用不同的方法。

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

于 2012-08-24T18:01:11.333 回答