マイクロ秒に切り捨て
明らかに、nanoseconds
を絞ることはできません。 の解決Instant
マイクロ秒
に MySQLデータ型DateTime
の解決 およびTimestamp
。
MySQLは使用していませんが、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 ) ;
JDBC4.2仕様
OffsetDateTime
のサポートが必要です しかし、奇妙なことに、より一般的に使用される2つのタイプ、Instant
は必要ありません。 およびZonedDateTime
。 JDBCドライバー
の場合 Instant
をサポートしていません 、変換します。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ; // Use `OffsetDateTime` if your JDBC driver does not support `Instant`.
Instant instant2 = odt.toInstant() ; // Convert from `OffsetDateTime` to `Instant`.
次に比較します。
Boolean result = instant.equals( instant2 ) ;
System.out.println( "instant: " + instant + " equals instant2: = " + instant2 + " is: " + result ) ;
あなたは賢明にも、データベースから引き出された値が元の値と一致しないことを心配しています。ビジネス上の問題に受け入れられる場合の1つの解決策は、元のデータのナノ秒をマイクロ秒に切り捨てることです。一般的にこのアプローチをお勧めします。
java.time クラスはtruncatedTo
方法。 ChronoUnit
を渡します 粒度を指定する列挙型オブジェクト。この場合、それは ChronoUnit.MICROS
。
Instant instant = Instant().now().truncatedTo( ChronoUnit.MICROS ) ;
現在、データにナノ秒が含まれている可能性は低いため、このアプローチで十分です。今日の主流のコンピューターは、私が知る限り、ナノ秒をキャプチャできるハードウェアクロックを備えていません。
エポックからのカウント
存在する可能性のあるナノ秒データを失う余裕がない場合は、エポックからのカウントを使用してください。
私は通常、エポック基準日からのカウントとして日時を追跡しないことをお勧めします。ただし、MySQLやPostgresなどのデータベースにナノ秒ベースの値をマイクロ秒ベースの値に制限して保存する方法は他にほとんどありません。
整数のペアを格納する
1970-01-01T00:00Zのようなエポック以来、非常に多くのナノ秒を使用するのではなく、Instant
の内部で採用されているアプローチに従うことをお勧めします。 クラス:ペアを使用します 数の。
多数の全体を保存する データベース内の整数としての秒。 2番目の列には、小数秒のナノ秒数を整数として格納します。
これらの数値は、Instant
から簡単に抽出/挿入できます。 物体。単純な64ビットのlong
のみ 数字が関係しています。 BigDecimal
は必要ありません またはBigInteger
。 2つの数値の少なくとも1つに32ビット整数列を使用できる可能性があると思います。ただし、単純にするため、およびjava.time.Instant
との直接の互換性のために、64ビット整数列タイプを選択します。 クラスのロングペア。
long seconds = instant.getEpochSecond() ;
long nanos = instant.getNano() ;
…そして…
Instant instant = Instant.ofEpochSecond( seconds , nanos ) ;
時系列で並べ替える場合は、マルチレベルの並べ替えを行う必要があります。最初に秒全体の列で並べ替え、次にナノ秒の小数列で次に並べ替えます。