先日、時間コンポーネントがいくつかの日付から切り捨てられていたという同様の問題に遭遇しました。
OracleDriverのバージョンの違いに絞り込みました。
OracleのFAQには、これに関するセクションがあります。
select sysdate from dual; ...while(rs.next())
9201より前では、これは次を返します。sysdateのgetObject:java.sql.Timestamp <<<< sysdateのgetDate:java.sql.Date sysdateのgetTimetamp:java.sql.Timestamp
9201以降は以下が返されます
sysdateのgetObject:java.sql.Date <<<<< sysdateのgetDate:java.sql.Date>>変更なしsysdateのgetTimetamp:java.sql.Timestamp>>変更なし
注:java.sql.Dateには時間部分がありませんが、java.sql.Timestampにはあります。
このデータ型マッピングの変更により、JDBCドライバーが8i /9iR1から920xJBDCドライバーにアップグレードされると、一部のアプリケーションが失敗したり、誤った結果が生成されたりします。互換性を維持し、アップグレード後もアプリケーションを機能させ続けるために、互換性フラグが提供されました。開発者にはいくつかのオプションがあります。
- oracle.jdbc.V8Compatibleフラグを使用します。
JDBC Driverは、デフォルトではデータベースのバージョンを検出しません。TIMESTAMPデータ型を処理するための互換性フラグを変更するには、接続プロパティ
'oracle.jdbc.V8Compatible'
'true'に設定でき、ドライバーは8i、901x、9 200で動作するように動作します(TIMESTAMPに関して)。
デフォルトでは、フラグは「false」に設定されています。OracleConnectionコンストラクタでは、ドライバはサーバーのバージョンを取得し、互換性フラグを適切に設定します。
java.util.Properties prop=newjava.util.Properties();
prop.put("oracle.jdbc.V8Compatible","true");
prop.put("user","scott");
prop.put("password","tiger");
String url="jdbc:oracle:thin:@host:port:sid";
Connection conn = DriverManager.getConnection(url,prop);
JDBC 10.1.0.xでは、接続プロパティの代わりに、次のシステムプロパティを使用できます。java-Doracle.jdbc.V8Compatible = true .....注:このフラグは、タイムスタンプと日付マッピング。データベース機能には影響しません。
'2。それに応じてDateおよびTimeStamp列のデータ型を処理する場合は、set/getDateおよびset/getTimestampを使用します。
9iサーバーは、日付とタイムスタンプの両方の列タイプをサポートします。DATEはjava.sql.Dateにマップされ、TIMESTAMPはjava.sql.Timestampにマップされます。
したがって、私の状況では、次のようなコードがありました。
import java.util.Date;
Date d = rs.getDate(1);
9iでは、java.sql.Timestamp(java.util.Dateのサブクラス)を取得していたので、すべてがグルーヴィーで、時間と分がありました。
しかし、10gでは、同じコードがjava.sql.Date(java.util.Dateのサブクラスでもあるため、コンパイルされます)を取得しますが、HH:MMは切り捨てられます!!。
2番目の解決策は私にとって非常に簡単でした-getDateをgetTimestampに置き換えるだけで、問題ないはずです。それは悪い習慣だったと思います。