我想在我的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)
我对MariaDB和日期类型有同样的问题。我已经尝试过org.joda.DateTime并输入java.util.time。服务器和客户端代码均正确支持毫秒。
问题是我使用的是MySQL Connector而不是MariaDB Connector / J JDBC驱动程序。
在大多数情况下,将MariaDB与MySQL Connector配合使用效果很好,但是我永远不会推荐这样做。当我搜索问题时,我正在通过Hibernate和Connector代码进行调试,并且看到许多基于服务器版本号而不是实际功能检测的功能检测。当然,版本号在MySQL和MariaDB之间有所不同。因此,很可能存在更多的兼容性问题被悄悄忽略。
您的问题很可能来自于您混合了日期和时间戳。将类型更改createdDate为java.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 对象中的值使用调试器..可能会给你带来线索。如果两者都包含毫秒,我会查看注释的用法或从工作示例开始。
| 归档时间: |
|
| 查看次数: |
4824 次 |
| 最近记录: |