当我尝试在时间戳列中插入" 2011/03/13 02:53:50.000000000"时,出现此错误。 如果我将13更改为15、14、12或11,则没有问题。 我还尝试将/更改为-,但仍然不能执行。
我浏览了与此错误相关的其他一些线索,但似乎没有一个适用。
我正在运行5.7.9版。
错误在哪里?
看看这个,它将对您有帮助。dev.mysql.com/doc/refman/5.7/en/datetime.html
错误消息是1292错误的日期时间值。
@CycleGeek,能否请您提供一些SQLfiddle片段来说明这一点?
@Farside,这是我的SQL FIDDLE,它似乎起作用。 奇怪的?
@CycleGeek,我在本地主机上获得了v.5.7.9-我没有看到任何问题。 您的"显示类似sql_mode的变量;"中的内容是什么?
@ Farside,only_full_group_by,strict_trans_tables,no_zero_in_date,error_for_division_by_zero,no_auto_create_user,no_engine_substitution。 另外,我将其列更改为datetime(6),并且有效吗? 但是它仍然困扰着我!
它很简单,只需使用Heidesql转到auth上的帐户即可,而不必只配置headesql即可,可以轻松配置数据时间更新
我花了一些时间才弄清楚...
问题在于,由于夏令时在2 AM和3 AM之间切换,因此'2011-03-13 02:53:50'是非法的,因此任何DST引入日的2 AM和3 AM之间的所有时间值均无效。与'2016-03-13 02:32:21'相同,依此类推。
将系统时区更改为不使用DST的时区,就可以了。
我认为您需要在插入MySQL前在MySQL中使用一些str转换。或者在对MySQL进行查询之前,以正确的格式准备数据。
微秒格式也是错误的。 MySQL文档明确指出:
A DATETIME or TIMESTAMP value can include a trailing fractional seconds part in up to microseconds (6 digits) precision.
更新:在我的本地主机上,我有相同版本的MySQL,它可以正常工作。
尝试执行转换
select str_to_date("2011-03-13 02:53:50.000000","%Y-%m-%d %H:%i:%s.%f") as `t`
并得到:
+----------------------------+
| t |
+----------------------------+
| 2011-03-13 02:53:50.000000 |
+----------------------------+
1 row in set (0.00 sec)
这是SQLFiddle,它确认了其他版本的MySQL上的情况。
我的想法用光了,我认为问题与表结构或特定版本的MySQL + OS中的"本地故障"有关。
那为什么当我将日期更改为15、14、12或11时有效吗? Ive也尝试使用6位数字,但也没有运气。
@CycleGeek,插入日期后您获得正确的转换,然后尝试重新选择它吗?我觉得字符串转换本身有问题
是的,如果我插入2011-03-12 02:53:50.000000或2011/03/12 02:53:50.000000,它可以正常工作。选择显示匹配的日期。 13由于某种原因无法正常工作?
@CycleGeek,尝试使用其他格式,很简单。用破折号代替斜杠,或使用STR_TO_DATE转换。这将对您有帮助。 TIMESTAMP值的范围是1970-01-01 00:00:01.000000到2038-01-19 03:14:07.999999。小数部分应始终与其余时间用小数点分隔
@CycleGeek,我检查了一下,还尝试了SQLFiddle(sqlfiddle.com/#!9/9b758/1/0),它可以工作。尝试转储您的数据库,看看有什么问题。
我尝试了str_to_date(2011-03-13 02:53:50.000000,%Y /%m /%d%H:%i:%s。%f)并得到了相同的错误。但是当我尝试str_to_date(2011-03-12 02:53:50.000000,%Y /%m /%d%H:%i:%s。%f)时,它起作用了!
@CycleGeek:-您提供的格式不同,日期也不同。只需尝试执行以下操作:str_to_date(2011/03/13 02:53:50.000000,%Y /%m /%d%H:%i:%s。%f)要更清楚一点,您使用破折号( -),并且格式使用(/)格式化程序
对不起,那是一个错字。
也许是因为最后一个数字实际上是月份,而不是日期,所以它对于大于12(=十二月)的数字失败
@Delphine,最后一个数字是日期。 15和14工作正常。
@CycleGeek好的,对不起,我没有注意到。您是否尝试过Farside更新?
您需要尝试以下操作:
STR_TO_DATE( '2011/03/13 02:53:50', '%Y/%m/%d %H:%i:%s')
否则,您必须使用破折号(-)插入日期,例如
'2011-03-13 02:53:50'
SQL FIDDLE DEMO
仍然不确定是什么问题,也许是CentOS和MySQL版本的组合。我将该列更改为datatime(6)而不是timestamp(6),并且能够成功导入所有数据。