以毫秒精度将java.util.Date保存在MySQL数据库中

Tim*_*Tim 6 jpa mariadb

我想在我的MariaDB中获得毫秒级的精度。经过研究,我发现需要更改columnDefinition-因此我在实体中执行了以下操作:

@NotNull
@Column(name = "createdDate", columnDefinition = "DATETIME(3) NOT NULL")
@Temporal(TemporalType.TIMESTAMP)
private TimeStamp createdDate;

@PrePersist
void onPersist() {
    createdDate = new Timestamp(new Date().getTime());
}
Run Code Online (Sandbox Code Playgroud)

创建列的结果SQL为:

`createdDate` DATETIME(3) NOT NULL
Run Code Online (Sandbox Code Playgroud)

现在,在数据库中,该值确实具有3个小数:

2016-09-12 16:57:44.000
Run Code Online (Sandbox Code Playgroud)

...但它们总是000

我做错了什么,或者我忘记了什么?

编辑:我试过没有JAVA:

CREATE TABLE `test` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `createdDate` DATETIME(3) NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
Run Code Online (Sandbox Code Playgroud)

然后:

INSERT INTO test (createdDate)
VALUES(current_timestamp())
Run Code Online (Sandbox Code Playgroud)

结果:

2016-09-13 13:57:44.000
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 5

我对MariaDB和日期类型有同样的问题。我已经尝试过org.joda.DateTime并输入java.util.time。服务器和客户端代码均正确支持毫秒。

问题是我使用的是MySQL Connector而不是MariaDB Connector / J JDBC驱动程序。

背景

在大多数情况下,将MariaDB与MySQL Connector配合使用效果很好,但是我永远不会推荐这样做。当我搜索问题时,我正在通过Hibernate和Connector代码进行调试,并且看到许多基于服务器版本号而不是实际功能检测的功能检测。当然,版本号在MySQL和MariaDB之间有所不同。因此,很可能存在更多的兼容性问题被悄悄忽略。


nii*_*zon 2

您的问题很可能来自于您混合了日期和时间戳。将类型更改createdDatejava.sql.Timestamp应该可以解决您的问题。

另外,如果您的 MySQL 版本早于 5.6.4,DateTime则不会让您节省时间分数。

OP编辑后编辑:

当您执行此操作时,您仍然将 Date Java 类型与 Timestamp 混合在一起:

createdDate = new Timestamp(new Date().getTime());
Run Code Online (Sandbox Code Playgroud)

你可以尝试createdDate = new Timestamp(System.currentTimeInMilliseconds());一下吗?

理想情况下,您应该使用 JodaTime 等库中的对象来避免此类问题,但这超出了您的问题的范围,只是一个提示:)

最终,如果这种创建时间戳的方法不起作用,我将使用数据库中的时间戳类型而不是日期时间,但这只是尝试和错误,因为日期时间应该在您的示例中也能工作。

编辑:摘自 Oracle 的日期 API:

Date()
Allocates a Date object and initializes it so that it represents the time at which it was allocated, measured to the nearest millisecond.
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使用System.currentTimeInMilliseconds()不应该改变结果 - 我的错。

为了解决这个问题,我开始通过 SQL 创建一个带有 CURRENT_TIMESTAMP 的日期(不通过 Java 对象传递),以确保该字段确实可以包含小数时间精度。如果没问题,请验证 Java 对象中的值使用调试器..可能会给你带来线索。如果两者都包含毫秒,我会查看注释的用法或从工作示例开始。