【问题标题】:Getting a MysqlDataTruncation exception when trying to persist a date that has been initialized with a millisecond argument尝试保持已使用毫秒参数初始化的日期时出现 MysqlDataTruncation 异常
【发布时间】:2019-07-09 17:34:40
【问题描述】:

我正在尝试创建一个距当前时间几年的日期。我这样做是这样的:

new Date(Math.abs(System.currentTimeMillis() - 94670778000L));

但是由于某种原因,日期的年份部分变成了一些随机的未知数,导致 jvm 抛出 MysqlDataTruncation 异常。这是完整的消息:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '55106056-02-25 05:40:34.461' for column 'lastSeenOnline' at row 1

根据 serhii 在此处的帖子:Data truncation: Incorrect datetime value: '' 我应该将 @Temporal 注释从 TemporalType.TIMESTAMP 更改为 TemporalType.TIME。这确实有帮助,但只是因为日期部分被省略了,所以这不是我正在寻找的解决方案。

谁能告诉我我做错了什么?我只是通过毫秒构造函数初始化一个新日期,它应该可以工作,但由于某种原因它不能。

【问题讨论】:

  • 嗯,MySQL 认为 55106056-02-25 05:40:34.461 格式不正确是正确的。没有经过测试,但 System.currentTimeMillis() - 94670778000L 感觉就像发生了 int 溢出,这可以解释今年奇怪的 55106056 值。
  • int 溢出是什么意思?日期参数是long 类型
  • "int 溢出是什么意思?date 参数是 long 类型" 是的,java 类型很长,是的。但是 MySQL 需要一个 int 年份,对吗?可能long到int的转换在数据库层发生了错误。
  • new Date(Math.abs(System.currentTimeMillis())) 与此new Date() 相同。两者都表示当前时间和日期的日期。只有第一个会抛出错误,而第二个不会。所以我不认为这是一个转换问题
  • 更正:new Date() 产生同样的错误..

标签: java mysql spring hibernate


【解决方案1】:

仍然不确定是什么原因造成的,但是从可嵌入类中删除导致问题的字段并将其放置在使用可嵌入类的类中解决了问题。所以对于任何面临同样问题的人,不要在可嵌入类中使用@Temporal。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多