Java: ResultSet getString() отличается между средами

У меня есть запрос SQL, который возвращает объект Date оракула. например:

ВЫБЕРИТЕ sysdate ОТ ДВОЙНОГО

В настоящее время существует код, который делает следующее:

String s = rs.getString ("sysdate");

Проблема в том, что это возвращает разный формат даты в разных средах (база данных одинакова).

Вернется одна среда:2011-01-31 12:59:59.0

Другой вернет что-то более странное: 2011-1-31 12.15.32.0 (время разделяется десятичными знаками)

Может быть, это как-то связано с локалью... одна машина "английский (Канада)", как сообщает java, другая - "английский (США)".

Что меня интересует, так это, когда результирующий набор преобразует объект даты в строку, откуда этот формат?

5 ответов

Решение

С сайта Oracle:

Во время подключения к базе данных библиотека классов JDBC устанавливает параметры сервера NLS_LANGUAGE и NLS_TERRITORY в соответствии с локалью виртуальной машины Java, на которой работает драйвер JDBC

Так что да, разница в ответе заключается в том, что на компьютерах указан другой языковой стандарт. Правильное решение должно состоять в том, чтобы использовать getDate() или getTimestamp() или заставить сервер базы данных возвращать дату в виде строки в определенном формате, как упоминалось ранее.

Я предлагаю не звонить getString совсем. Запрошенное вами значение не является строкой, это дата или отметка времени. Так что звоните getDate или же getTimestamp вместо. (Я не знаю, какой из них является наиболее подходящим, это зависит от точной семантики sysdate.)

Если вам необходимо отформатировать его, вы можете сделать это соответствующим образом.

По сути, чем меньше текстовых преобразований между вашим кодом и базой данных, тем лучше. Это одна из причин использования параметризованных запросов - вам не нужно заботиться о том, как база данных будет анализировать числовые значения или даты и время; Вы просто предоставляете значение. Это то же самое, но наоборот.

В драйверах 11g формат кажется жестко закодированным. призвание getString() на наборе результатов в конечном итоге вызывает это:

oracle.sql.TIMESTAMPTZ.toString(int year, int month, int day, int hours, int minutes, int seconds, int nanos, String regionName)

Для свиданий, oracle.jdbc.driver.DateAccessor.getString() вызывает это с nanos=-1, и результат использует формат "гггг-мм-дд чч: мм: сс"

Для меток времени используется формат "гггг-мм-дд ЧЧ: ММ: СС.С". Будет включено до 9 цифр наносекунд.

На самом деле еще один интересный результат заключается в том, что это значительно изменилось с 10 г до 11 г:

10.2.0.5.0:

select a DATE value and use getString to read it

2009-04-20 00:00:00.0

select a TIMESTAMP value and use getString to read it

2010-10-15.10.16. 16. 709928000

11.2.0.2.0:

select a DATE value and use getString to read it

2009-04-20 00:00:00

select a TIMESTAMP value and use getString to read it

2010-10-15 10:16:16.709928

Могут ли в вашей среде использоваться разные версии драйверов Oracle JDBC?

Если вы действительно хотите использовать его в качестве строки, лучше использовать to_char в запросе.

SELECT to_char(sysdate, 'MM/DD/YYYY') FROM DUAL; 

Это будет соответствовать.

Не использовать getStringиспользовать getDate (или же getTimestamp). Таким образом, он не будет полагаться на ядро ​​базы данных, чтобы преобразовать его в строку.

Другие вопросы по тегам