【问题标题】:Incorrect datetime value while saving data to MySql将数据保存到 MySql 时日期时间值不正确
【发布时间】:2016-10-27 08:10:32
【问题描述】:

我在将 java Date 对象保存到 MySql 数据库时遇到了一个奇怪的问题。这是我得到的错误:

Incorrect datetime value: '1970-01-01 02:55:00' for column 'start_time' at row 1

我的 sql 脚本

CREATE TABLE `schedules` (
            `id` bigint(20) NOT NULL AUTO_INCREMENT,
            `start_time` timestamp NOT NULL,
            `end_time` timestamp NOT NULL,
            PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8

我的实体的一部分:

 @Column(name = "start_time")
 private Date startTime;

当我尝试做类似的事情时

String time = "02:55"
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
scheduleEntity.setStartTime(sdf.parse(time));

repository.save(scheduleEntity);

它出错了。但是当我使用"16:00" 字符串进行解析时,它可以完美运行。我使用 Spring Boot,Spring Data 和 Hibernate。有人能帮我吗?

【问题讨论】:

  • 如果你只想记录时间,而不是日期和时间,那么在 MySQL 中使用 time 数据类型,而不是时间戳。
  • 听起来是个好主意!我测试过,它有效。您能否将其作为完整答案发布,并附上一些关于如何存储时间并将其映射到 java 的简短有用的 cmets?提前致谢! @影子
  • 你能试试这个 sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

标签: java mysql spring hibernate


【解决方案1】:

显然,您只想在表中存储时间部分,但您使用 timestamp 数据类型,它既存储日期和时间,还具有其他特殊功能。

如果你只想存储时间,那么使用 MySQL 的time data type:

MySQL 以“HH:MM:SS”格式(或“HHH:MM:SS”格式用于大小时值)检索和显示 TIME 值。 TIME 值的范围可以从“-838:59:59”到“838:59:59”。小时部分可能很大,因为 TIME 类型不仅可以用来表示一天中的某个时间(必须小于 24 小时),还可以用来表示经过的时间或两个事件之间的时间间隔(可能远大于24 小时,甚至是负数)。

链接的文档包含一个链接,该链接解释了time literals are interpreted.

【讨论】:

  • 而在java中对应的映射类型是什么? java.util.Date?当我坚持它时,我的控制台日志包含警告消息Incorrect time value: '1970-01-01 00:10:00' for column 'start_time' at row 1
  • 我相信你需要使用@Temporal(TemporalType.TIME)注解来标记该列是时间数据类型,或者使用java.sql.Time作为java数据类型。但我并不是真正的 java 和 hibernate 专家。
【解决方案2】:

您的列类型是 TIMESTAMP

11.3.1 The DATE, DATETIME, and TIMESTAMP Types

TIMESTAMP 数据类型用于同时包含日期和时间部分的值。 TIMESTAMP 的范围为 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。

解决方案 您可以直接在 DB 中将 start_time 和 end_time 列类型更改为 DATETIME 或删除表并像这样更改您的实体

@Column(name = "start_time", columnDefinition="DATETIME")
@Temporal(TemporalType.TIMESTAMP)
private Date startTime;

希望对你有帮助

【讨论】:

  • 但是“1970-01-01 02:55:00”在“1970-01-01 00:00:01”之后。那么问题出在哪里?
  • 我想这取决于您的时区,例如如果 +4 早于 '1970-01-01 00:00:01' UTC
  • 你好丹尼亚尔。你救了我。这就是preparedStatement.setTimestamp(paramIndex, new java.sql.Timestamp(0)) 不起作用的原因。虽然我不知道发生了什么update.setTimestamp(paramIndex, new java.sql.Timestamp(3601000)) 对我有用(下面没有)。它是格林威治标准时间 + 1 小时 + 1 秒。嗯?!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多