1. ホーム
  2. java

[解決済み] java.util.Dateとjava.sql.Dateの比較

2022-03-19 21:06:30

質問

java.util.Datejava.sql.Date どのような場合にどちらを使うのか、またその理由は?

どのように解決するのですか?

おめでとうございます。あなたは、私がJDBCで一番嫌いなものにぶち当たりました。日付クラスの処理です。

基本的にデータベースは通常、少なくとも は、日付、時刻、タイムスタンプといった形式のフィールドです。これらはそれぞれ JDBC で対応するクラスを持っており は、それぞれ java.util.Date . この3つのそれぞれのクイックセマンティクスは以下の通りです。

  • java.sql.Date はSQL DATEに対応しており、これはつまり 年、月、日 一方 時、分、秒、ミリ秒 は無視されます。さらに sql.Date はタイムゾーンに縛られない。
  • java.sql.Time はSQL TIMEに対応し、当然のことながら、以下の情報のみが含まれます。 時、分、秒、ミリ秒 .
  • java.sql.Timestamp は、ナノ秒単位の正確な日付であるSQL TIMESTAMPに対応する( ただし util.Date はミリ秒にしか対応していません! ) の精度をカスタマイズすることができます。

この3つの型に関連してJDBCドライバを使用する際に最も多いバグの1つは、型が正しく処理されないということです。 これは、以下のことを意味します。 sql.Date はタイムゾーンに依存します。 sql.Time は、現在の年、月、日、などなど。

最後に どれを使うか?

フィールドのSQLタイプに依存します、本当に。 PreparedStatement には、3つの値すべてに対するセッターがあります。 #setDate() に対するものである。 sql.Date , #setTime() について sql.Time#setTimestamp() に対して sql.Timestamp .

を使用する場合は注意してください。 ps.setObject(fieldIndex, utilDateObject); を指定すると、実際には通常の util.Date しかし、その後でデータを要求したときに、実際には足りないものがあることに気づくかもしれません。

本当はDatesはどれも使うべきではないと言っているのです。

私が言いたいのは、ミリ秒/ナノ秒をプレーンな長さとして保存し、使用しているオブジェクトに変換することです ( joda-timeプラグ ). 例えば、今なら 20100221 と 154536123 のように、日付成分と時間成分を別の長さで保存します。これらのマジックナンバーはSQLクエリで使用することができ、データベースから別のデータベースへポータブルになり、JDBC/Java Date APIのこの部分を完全に回避することができます。