java instant 在mysql_如何在MySQL数据库中存储Java Instant

小编典典

截短至微秒

显然,我们无法将an的纳秒分辨率压缩Instant为MySQL数据类型DateTimeand 的微秒分辨率Timestamp。

我以为JDBC驱动程序在接收到时会忽略纳秒Instant,将值截断为微秒。我建议您尝试一下实验,或者检查符合JDBC

4.2及更高版本的驱动程序的源代码。

Instant instant = Instant.now().with( ChronoField.NANO_OF_SECOND , 123_456_789L ) ; //Set the fractional second to a spefic number of nanoseconds.

myPreparedStatement.setObject( … , instant ) ;

…和…

Instant instant2 = myResultSet.getObject( … , Instant.class ) ;

然后比较。

Boolean result = instant.equals( instant2 ) ;

System.out.println( "instant: " + instant + " equals instant2: = " + instant2 + " is: " + result ) ;

您明智地担心从数据库中提取的值与原始值不匹配。一种解决方案(如果您的业务问题可以接受的话)是将原始数据中的任何纳秒缩短为几微秒。我通常推荐这种方法。

Instant instant = Instant().now().truncatedTo( ChronoUnit.MICROSECONDS ) ;

目前,这种方法就足够了,因为您不太可能在数据中包含任何纳秒级的数据。据我所知,当今的主流计算机不支持能够捕获纳秒级的硬件时钟。

从时代开始计数

如果您无法承受丢失任何可能存在的纳秒级数据的情况,请使用“从纪元开始计数”。

我通常建议不要跟踪日期时间作为从参考日期开始的计数。但是在将基于纳秒级的值存储在数据库(如MySQL和Postgres)中,除了基于微秒级的值之外,您还有其他选择。

存储整数对

我建议不要使用自1970年1月1日T00:00Z这样的纪元以来的极大量的纳秒,而是建议遵循Instant类的内部方法:使用一 对 数字。

存储多个 整 秒为你的数据库的整数。在第二列中,将小数秒中的纳秒数存储为整数。

您可以轻松地将这些数字从Instant对象中提取/注入到对象中。仅long涉及简单的64位数字。不需要BigDecimal或BigInteger。我想您可能可以对两个数字中的至少一个使用32位整数列。但是我会选择64位整数列类型,以简化操作并与java.time.Instant类的long对直接兼容。

long seconds = instant.getEpochSecond() ;

long nanos = instant.getNano() ;

…和…

Instant instant = Instant.ofEpochSecond( seconds , nanos ) ;

按时间顺序排序时,您需要进行多级排序,首先在整个秒数列上进行排序,然后在nanos秒的列上进行第二次排序。

2020-11-16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值