9

JDBC と Postgres で何かが起こったときのタイムゾーンを保存したい場合は、タイムスタンプとは別にタイムゾーンを保存する必要があるようです (おそらく私が間違っているかもしれません)。

つまり、ORM/JDBC/JPA に Java Calendar(または Joda DataTime) を指定し、タイムゾーンAmerica/New_Yorkを Postgrestimestampzフィールドに指定することをお勧めします。Calendarそして、サーバーのタイムゾーン (またはデフォルトで UTC) に関係なく、取得時にwith timezone が返されることを期待しますAmerica/New_York。しかし、ほとんどの JDBC コード (およびそれに依存するものは発生しない) を見るだけです。

これは正しいです?

postgres がサポートしているときに tz を別のフィールドに格納する必要があるというのはばかげているように思えます。

したがって、次の 2 つのオプションしかないようです。

  1. timestampzPostgres 列を a として選択しjava.util.String、解析します。
  2. タイムゾーンを別のフィールドとして保存します。

オプション番号 1 と 2 では、SQL マッピング / ORM ライブラリに何らかの変換インターセプターが必要になります。

  • JDBC に最適なソリューションは何ですか?
  • JPA の最適なソリューションは何ですか (JDBC と異なる場合)?
4

2 に答える 2

11

timestamp with time zone( ) を保存timestamptzすると、DB に保存するために UTC に変換されます。取得すると、元のタイムゾーンではなく、クライアントの現在のタイムゾーンに変換されます。基本的には、ある時点です。

timestamp without time zone( )もありtimestampます。これは変換の対象ではありませが、タイムスタンプはありません。クライアントのタイム ゾーンを UTC に設定してを保存しtimestamp、クライアントのタイム ゾーンが「+08:00」のときに取得すると、同じ値が得られます。生の時間値を保持するという点で、それはあなたが望むものの半分です。

名前と動作はひどく紛らわしいですが、SQL 標準によって設定されています。

特定のタイム ゾーンの時点を記録する場合は、タイム ゾーンを個別に保存する必要があります。に制限する制約付きINTERVALとして保存することをお勧めします。その定義は -12:00 を拒否し、+12:00 を受け入れます。それが正しいかどうかは完全にはわかりませんので、確認してください。CHECKcolname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR

timestampそのタイム ゾーンの現地時間 (私がおそらく行うこと) を保存するか、timestamptzイベントが発生した UTC 時間と現地時間に変換できるオフセットを保存することができます。

JDBC ではどちらでも問題なく動作します。JPA の場合、プロバイダーが間隔タイプをどれだけ理解し、マッピングするかに依存します。理想的には、エンティティに一時的に生成されたフィールドが必要です。これは、必要な Cal​​endar インスタンスを再構築し、データベースtimestampinterval保存します。

于 2012-09-09T11:40:01.847 に答える
0

EclipseLinkはOracleでのタイムゾーンの保存をサポートしています。PostgreSQLPlatformをカスタマイズした場合は、Postgresにもタイムゾーンを保存できると思います。

于 2012-09-10T17:42:30.797 に答える