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

Jooq LocalDateTimeフィールドは、セッションタイムゾーンではなくシステムタイムゾーンを使用します

    最近、使用しているデータベースドライバーによっては、jOOQがDateTime解析で奇妙な動作を示す可能性があることを発見しました。 jOOQは、オフセット日時をZ(UTC)として返しますが、そうではありません

    具体的には、私の場合、別のPostgresドライバーを使用すると、DefaultBinding.javaはタイムスタンプを持つカレンダーオブジェクトを受け取りますが、解析するためにtoStringを呼び出します。結局、toStringはタイムゾーンを出力せず、jOOQはそれが現地時間であると推測しました。

    私にとって、DefaultBinding.javaの問題のある行(タイムゾーン付きのタイムスタンプを使用していました)は次のとおりです。

    else if (type == OffsetDateTime.class) {
        result = (T) offsetDateTime(ctx.resultSet().getString(ctx.index()));
    }
    

    タイムゾーンがないことに基づいて、他の一連のifの別の行にいる可能性があります。

    私のテストでは、システム時間を変更すると結果が変わることもわかりましたが、セッション時間を変更しても何も起こりませんでした。

    私にとって幸いなことに、標準のPostgresドライバーに切り替えることで問題は解決しました。そうでない場合は、OffsetDateTimeのバインディングをオーバーロードして、toStringの使用と、それに関連する関連するタイムゾーンの削除を修正することを検討しました。残念ながら、アップグレードまたは置換できるSQLドライバーを使用していない限り、そのパスを追求する必要があるかもしれません。または、タイムゾーンを指定して保存し、データベースからロードするときに目的のタイムゾーンに変換することもできます。




    1. 値が配列にあるプリペアドステートメント

    2. MySQLのGROUP_CONCATとLongtextの問題

    3. mysqlを使用して文字列を分割する

    4. SQL WHERE..IN句の複数の列