sql >> データベース >  >> RDS >> Mysql

JavaInstantをMySQLデータベースに保存する方法

    マイクロ秒に切り捨て

    明らかに、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は必要ありません。 およびZonedDateTimeJDBCドライバー の場合 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 ) ;
    

    時系列で並べ替える場合は、マルチレベルの並べ替えを行う必要があります。最初に秒全体の列で並べ替え、次にナノ秒の小数列で次に並べ替えます。




    1. MS Access:長所と短所

    2. Doctrineの結合テーブル(ManyToMany)から行を削除するにはどうすればよいですか?

    3. SQLServerの「Waitforでクエリは許可されていません」エラー101

    4. mySqlのauto_incrementフィールドをリセットできますか?