ISO 8601 MySQL数据库时间戳:MySQL日期时间值不正确

时间:2012-08-24 17:40:33

标签: mysql node.js datetime phpmyadmin iso8601

错误日志:

  

{[错误:日期时间值不正确:'2012-08-24T17:29:11.683Z'for   列''机器人_refreshed_at'在第1行]编号:1292,sqlStateMarker:   '#',sqlState:'22007',消息:'日期时间值不正确:   \'2012-08-24T17:29:11.683Z \'for column \'robot_refreshed_at \'at row   1',sql:'INSERT INTO用户   (ID,姓名,count_moments,count_likes,count_followers,抢   ot_refreshed_at,robot_count_followers)VALUES   (\ '1834084 \' \ 'NNNyingzi \',\ '5 \' \   '0 \',\'0 \',\'2012-08-24T17:29:11.683Z \',\'0 \')',setMaxListeners:   [功能],发出:[功能],addListener:[功能],开:[功能],   一次:[Function],removeListener:[Function],removeAllListeners:   [功能],听众:[功能]}

我在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复制了一个表。

非常感谢。

2 个答案:

答案 0 :(得分:11)

Date and Time Literals中所述:

  

MySQL会识别以下格式的DATETIMETIMESTAMP值:

     
      
  • 作为'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''070523091528'被解释为'2007-05-23 09:15:28',但'071122129015'是非法的(它具有无意义的分钟部分)并变为'0000-00-00 00:00:00'

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

  •   
     

DATETIMETIMESTAMP值可包括最小微秒(6位)精度的尾随小数秒部分。虽然可以识别此小数部分,但会将其从存储在DATETIMETIMESTAMP列中的值中丢弃。有关MySQL中小数秒支持的信息,请参阅Section 11.3.6, “Fractional Seconds in Time Values”

'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 自UNIX纪元以来)并通过MySQL的FROM_UNIXTIME()函数。

答案 1 :(得分:2)

我在这个链接上找到了它:

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

似乎插入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

的功能