Чтение столбца Timestamp из Oracle с использованием Java .. rs.getString (index) - PullRequest
0 голосов
/ 21 февраля 2012

При чтении данных столбца Timestamp из Oracle 10g с использованием Java 6 я прочитал его следующим образом:

String str = rs.getString(index);

Я не хочу использовать rs.getTimestamp().Теперь, когда я делаю то же самое со столбцом Date, я получаю соответствующее строковое представление Date.Но с меткой времени я получаю строку следующим образом:

2009-5-3 12:36:57. 618000000

Я не понимаю, почему пробел вводится незадолго до миллисекунд.Это делает метку времени, которую я читаю, неразборчивой по заранее заданным форматам меток времени.Есть идеи, почему я получаю пробел до миллисекунд?

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Хорошо, так что это то, к чему я собираюсь, и это кажется мне возможным решением.

ResultSet rs = st.executeQuery("..");
ResultSetMetaData rsmt = rs.getMetaData();
int columnIndex = 0;
while (rs.next()) {
if (rsmt.getColumnType(columnIndex) == 93) { // ts field - ref. -> http://www.devdaily.com/java/edu/pj/jdbc/recipes/ResultSet-ColumnType.shtml
    Timestamp tsTemp = this.getTimestamp(columnIndex);
    return tsTemp.toString(); // this does give the timestamp in correct format
}
columnIndex ++;
}
0 голосов
/ 21 февраля 2012

Вы делаете неявное преобразование в строку, поэтому форматирование определяется настройкой NLS_TIMESTAMP_FORMAT сеанса вашей базы данных, которая является производной от вашего языкового стандарта Java.Хотя это странный формат, поэтому, возможно, он каким-то образом переопределяется.

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

select timestamp_field from ...

, сделайте что-то вроде

select to_char(timestamp_field, 'YYYY-MM-DD HH24:MI:SS.FF3') from ...

В качестве альтернативы вы можете изменить свой языковой стандарт;или установите формат в сеансе, выполнив alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS.FF3' перед вашим запросом, но вам придется делать это в каждом сеансе (или использовать триггер входа в систему), и это может потенциально привести к неожиданным последствиям в другом месте, особенно при использовании пула соединений.Явное извлечение данных из базы данных в нужном вам формате является более очевидным и не сломается, если кто-то еще что-то изменит позже.

...