Java 在MySQL数据库中存储微秒

Java 在MySQL数据库中存储微秒,java,mysql,datetime,playframework,playframework-2.0,Java,Mysql,Datetime,Playframework,Playframework 2.0,我有一个带ebeans的Play Framework应用程序。为了在主系统和脱机系统之间进行同步,我使用addDate字段来识别唯一的记录 这在开发和初始测试(使用jdbc:h2:mem:play进行开发;MODE=MYSQL)以及使用有限的数据集进行测试时非常有效 但是在生产环境中,我发现MySQL数据库中没有存储毫秒。我将字段创建为datetime(6),但查询如下: SELECT UNIX_TIMESTAMP(add_date) FROM `user` WHERE 1 返回: 1499

我有一个带ebeans的Play Framework应用程序。为了在主系统和脱机系统之间进行同步,我使用addDate字段来识别唯一的记录

这在开发和初始测试(使用jdbc:h2:mem:play进行开发;MODE=MYSQL)以及使用有限的数据集进行测试时非常有效

但是在生产环境中,我发现MySQL数据库中没有存储毫秒。我将字段创建为datetime(6),但查询如下:

SELECT UNIX_TIMESTAMP(add_date) FROM `user` WHERE 1 
返回:

1499722493.000000
1499772800.000000
1499777225.000000
1499790922.000000
1499875868.000000
1499954855.000000
1499977124.000000
1499981148.000000
1499986822.000000
(注:只需在MySQL return 2015-12-17 16:15:50.000000中选择add_date字段,显示精度在那里)

因此毫秒不会被存储。在Java中,我使用普通的Date类,所以它们在那里(在H2测试数据库中也是如此)

我如何将毫秒存储在当前配置的数据库中,而不必重写太多代码

[编辑:]

I am using MySQL on Debian: Ver 14.14 Distrib 5.6.35
sbt.version=0.13.11
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.16")
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.2")
mysql-connector-java % 5.1.43

在java中,如果不占用大量系统资源,就无法精确到微秒(纳秒)。您的日期是以毫秒为单位插入的,因为java是以毫秒为单位插入的

如果要从SQL使用微秒,则必须在插入时使用SQL NOW()

java.time 麻烦的
java.util.Date
类现在被类取代

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

捕获当前时刻在Java8中仅限于,但在Java9中可扩展到纳秒级,更高版本可扩展为。为了清楚起见,我将重复:Java8和Java9都可以存储纳秒级的值,但只有Java9和更高版本才能以小于毫秒的分辨率捕获当前时刻

Instant instant = Instant.now() ;  // Captures milliseconds in Java 8 but nanoseconds in Java 9+.
使用符合JDBC 4.2或更高版本的JDBC驱动程序,直接使用java.time类型,而不是黑客攻击的java.sql类型。调用
PreparedStatement::setObject
ResultSet::getObject
方法

myPreparedStatement.setObject( … , instant ) ;
……还有

Instant instant = myResultSet.getObject( … , Instant.class ) ; // Transfers a value with nanoseconds if present.

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

这是一个什么样的Play Framework?它是一个Play Framework应用程序。在ebeans实现和MySql数据库之间的某个地方,毫秒不会被存储。因此,这似乎是一个游戏框架问题。我是否需要添加注释以使实现以不同的方式对待它,或者以不同的方式定义字段?为什么它与H2 men一起工作而不与MySQL一起工作?MySQL的哪个版本?MySQL版本14.14。对不起,版本14.14发行版5.6.35。数据库中的分数/微秒没有问题,我已经测试过了。我需要弄清楚如何将这个精度从我的Play应用程序保存到数据库中。谢谢,毫秒如果我觉得合适的话,那么秒就是不够精确。但我怎样才能让它起作用呢?由于Play/eBeans似乎与h2/mem选项配合使用,它是连接器/J接口吗?我用datetime(6)创建了我的表。对不起。我不知道,如果可以的话,现在就用,剩下的都是浪费时间。日期上的唯一ID也是一个很大的错误。Java.sql.Timestamp而不是Java.util.date可能是,使用Timestamp mysql typeI我在Java代码上尝试了Timestamp,但没有什么区别。我不使用日期作为唯一id,但将其用作两个独立系统之间的参考,因为相关项目可能具有不同的id。也许这将在未来的版本中得到解决,因为只有在MySQL 5.6之后,这才有可能并适用于H2。第一句话是什么意思?你能举出文件吗?
Instant instant = myResultSet.getObject( … , Instant.class ) ; // Transfers a value with nanoseconds if present.