16

当我尝试将“2011/03/13 02:53:50.000000000”插入时间戳列时出现此错误。如果我将 13 更改为 15、14、12 或 11,它就没有问题。我也尝试将 /'s 更改为 -'s 并且仍然不行。

我查看了与此错误相关的其他一些线程,但似乎没有一个适用。

我正在运行版本 5.7.9。

4

4 回答 4

46

我花了一段时间才弄清楚这一点......

问题是“2011-03-13 02:53:50”是非法的,因为夏令时在凌晨 2 点到 3 点之间切换,所以在任何 DST 引入日凌晨 2 点到 3 点之间的所有时间值都是无效的。'2016-03-13 02:32:21' 等相同。

将系统时区更改为不使用 DST 的时区,您应该没问题。

于 2016-03-12T22:37:20.690 回答
3

你需要试试这个:

STR_TO_DATE( '2011/03/13 02:53:50', '%Y/%m/%d %H:%i:%s')

否则您必须使用破折号分隔符(-)插入日期,例如

'2011-03-13 02:53:50' 

SQL 小提琴演示

于 2016-02-24T13:04:36.877 回答
2

仍然不确定问题是什么,可能是 CentOS 和 MySQL 版本的组合。我将列更改为 datatime(6) 而不是 timestamp(6),并且能够成功导入所有数据。

于 2016-02-24T16:43:20.023 回答
1

我认为您需要在插入之前在 MySQL 中使用一些 str 转换。或者在对 MySQL 进行查询之前以适当的格式准备数据。

微秒格式也是错误的。MySQL 文档清楚地说明了这一点

DATETIME 或 TIMESTAMP 值可以包括以微秒(6 位)精度为单位的尾随小数秒部分。


更新:在我的本地主机上,我有相同版本的 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 中的“本地故障”有关。

于 2016-02-24T13:12:31.590 回答