Однажды я столкнулся с подобной проблемой, когда компонент времени урезался по некоторым датам.
Мы сократили разницу в версиях драйверов Oracle.
В FAQ Oracle есть раздел об этом:
select sysdate from dual; ...while(rs.next())
До 9201 г. возвращается:
getObject для sysdate: java.sql.Timestamp <<<<
getDate для sysdate: java.sql.Date
getTimetamp для sysdate: java.sql.Timestamp </p>
Начиная с 9201 года будет возвращено следующее
getObject для sysdate: java.sql.Date <<<<<
getDate для sysdate: java.sql.Date >> без изменений
getTimetamp для sysdate: java.sql.Timestamp >> без изменений
Примечание: java.sql.Date не имеет временной части, тогда как java.sql.Timestamp делает.
С этим изменением в отображении типа данных, некоторые приложения не будут работать и / или будут выдавать неправильные результаты при обновлении драйвера JDBC с 8i / 9iR1 до 920x драйвера JBDC.
Для обеспечения совместимости и обеспечения работы приложений после обновления был предоставлен флаг совместимости. У разработчиков теперь есть несколько вариантов:
- Используйте флаг oracle.jdbc.V8Compatible.
Драйвер JDBC по умолчанию не определяет версию базы данных. Чтобы изменить флаг совместимости для обработки типов данных TIMESTAMP, свойство соединения
'oracle.jdbc.V8Compatible'
может быть установлено в значение «истина», и драйвер ведет себя так же, как и в 8i, 901x, 9 200 (относительно TIMESTAMP).
По умолчанию флаг установлен на «ложь». В конструкторе 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. Используйте set / getDate и set / getTimestamp при работе с типом данных столбца Date и TimeStamp соответственно.
Сервер 9i поддерживает типы столбцов Date и Timestamp. 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 TRUNCATED !!.
2-е решение было довольно простым для меня - просто замените getDate на getTimestamp, и все будет в порядке. Я думаю, это была плохая привычка.