mysql入库时间不正确,关于sql时间戳:MySQL 1292日期时间值不正确

当我尝试在时间戳列中插入" 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),并且能够成功导入所有数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值