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以这些格式识别
DATETIME
和TIMESTAMP
值:
作为
'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'
。作为
YYYYMMDDHHMMSS
或YYMMDDHHMMSS
格式的数字,条件是该数字作为date是有意义的。 例如,19830905132800
和830905132800
被解释为'1983-09-05 13:28:00'
。
DATETIME
或TIMESTAMP
值可以包含以微秒(6位)为精度的尾随小数秒部分。 虽然这个小数部分是被识别的,但是从存储在DATETIME
或TIMESTAMP
列中的值中被丢弃。 有关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
的能力