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

PostgresのタイムゾーンデフォルトCURRENT_TIMESTAMPなしのフィールドTIMESTAMPのJPAモデルクラス?

    間違ったタイプ

    LocalDateTime ここでは間違ったタイプです。 Javadocで説明されているように、そのクラスは瞬間を表すことはできません。

    そのクラスには、意図的にタイムゾーンやUTCからのオフセットの概念がありません。つまり、「2019年1月23日の正午」などの日付と時刻を表しますが、それが東京、パリ、またはモントリオールの正午であるかどうかはわかりません。たとえば、3つのまったく異なる瞬間です。数時間離れています。したがって、このタイプは、標準のSQLタイプTIMESTAMP WITHOUT TIME ZONEに適しています。 –なし with ではありません 。

    詳細については、次を参照してください: InstantとLocalDateTimeの違いは何ですか?

    右タイプ

    標準SQLタイプの場合TIMESTAMP WITH TIME ZONE 、JavaタイプInstantを使用する必要があります 、OffsetDateTime 、またはZonedDateTime 。これら3つのうち、JDBC4.2では2番目のOffsetDateTimeのみのサポートが必要です。 。

    検索。

    OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
    

    Postgresから取得される値は常にUTCになります。 SQL標準ではこの動作が指定されていないため、データベースは異なります。 Postgresでは、タイプTIMESTAMP WITH TIME ZONEのフィールドに送信された値 UTCに調整されます。取得される値はUTCです。

    保管。

    myPreparedStatement.setObject( … , odt ) ;
    

    UTC(ゼロのオフセット)から特定の地域の人々が使用する実時間(タイムゾーン)に調整します。

    ZoneId z = ZoneId.of( "Asia/Tokyo" ;
    ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
    

    JPA

    私はJPAを使用せず、物事をシンプルに保つことを好みます。

    しかし、この回答 によると 、JPA2.2はjava.timeをサポートします タイプ。

    Hibernateはjava.timeもサポートします 。




    1. MySQL-レコードセットの行番号?

    2. SQLエラーが発生しました:ORA-01843:有効な月ではありません

    3. MySQLで複数の列に一意の制約を指定するにはどうすればよいですか?

    4. MySQLWorkbenchで外部キーを追加するときのMySQLエラー1064