INSERT INTO mst(time) VALUES (?);
time は、PostgreSQLデータベースのTimestamp型です。Joda-Time のDateTimeオブジェクト
を挿入しています。または挿入しようとしていると言うべきです。DateTime オブジェクトをjava.sql.Timestampに変換する方法が見つかりません。Joda-Time のドキュメントを読んだことがありますが、これに関する参照はありません。
ありがとう。
INSERT INTO mst(time) VALUES (?);
time は、PostgreSQLデータベースのTimestamp型です。Joda-Time のDateTimeオブジェクト
を挿入しています。または挿入しようとしていると言うべきです。DateTime オブジェクトをjava.sql.Timestampに変換する方法が見つかりません。Joda-Time のドキュメントを読んだことがありますが、これに関する参照はありません。
ありがとう。
最初に Joda DateTime を long (エポックからのミリ秒) に変換してから、そこから Timestamp を作成できます。
DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());
JodaTime の DateTime コンストラクターがこれを処理できるようになりました。(質問が投稿されたときにそれが本当かどうかはわかりませんが、Googleのトップの結果なので、新しい解決策を追加すると思いました。)
いくつかの API オプションがあります。
public DateTime(Object instant);
public DateTime(Object instant, DateTimeZone zone);
どちらのオプションも java.util.Date を拡張するため java.sql.Timestamp を受け入れますが、DateTime と Date はミリ秒単位の解像度しか持たないため、ナノ秒は無視されます (フローリングされます)。特定のタイムゾーンがない場合、デフォルトで DateTimeZone.UTC になります。
<教訓モード>
「分解能」とは、何桁の数字を出すかです。「精度」は表現の正確さです。たとえば、MSSQL の DateTime の分解能はミリ秒ですが、精度は 1/3 秒までしかありません (DateTime2 の分解能は可変で、精度はより高くなります)。
</教訓モード>
ミリ秒単位の UTC タイムスタンプの例:
new DateTime(resultSet.getTimestamp(1));
データベースで TIMESTAMP WITH TIME ZONE を使用している場合は、タイム ゾーンをサポートしていないため、java.sql.Timestamp を使用できません。ResultSet#getString を使用して文字列を解析する必要があります。
タイム ゾーンなしのタイムスタンプと 2 番目の解像度の例**:
LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.parseLocalDateTime(resultSet.getString(1));
2 番目の解像度の UTC タイムスタンプの例**:
DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.parseDateTime(resultSet.getString(1));
2 番目の解像度のタイム ゾーン (オフセット形式) を含むタイムスタンプの例**:
DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z")
.parseDateTime(resultSet.getString(1));
おまけ: DateTimeFormat#forPattern はパターンごとにパーサーを静的にキャッシュするので、その必要はありません。
<教訓モード>
通常、解決を明示的に行い、中間オブジェクトの生成を回避するために、DBO モデルで文字列を使用することをお勧めします。(2013-11-14 09:55:25 は 2013-11-14 09:55:25.000 と同じですか?) 私は一般的に、データ保存に関する最適化を行う「データベース モデル オブジェクト」と、データ保存に関する最適化を行う「ビジネス モデル オブジェクト」を区別しようとしています。間に変換/マッピング レイヤーがあるサービス レベルの使用。ビジネス オブジェクトを直接生成する CRUD ベースの DAO を使用すると、優先順位が混同され、どちらにも最適化されず、エッジ ケースを逃したために予期しない場所から例外がスローされる傾向があることがわかりました。明示的な変換レイヤーを使用すると、データ ソースを制御しない場合など、必要に応じて検証を追加することもできます。
</教訓モード>
* ビジネス モデルでナノ秒の解像度に解決する必要がある場合は、別のライブラリを使用する必要があります。
** タイムスタンプ文字列の形式はデータベースによって異なる場合がありますが、よくわかりません。