使用Java从Oracle读取Timestamp列.rs.getString(index)

时间:2012-02-21 12:12:12

标签: oracle jdbc timestamp

使用Java 6从Oracle 10g读取Timestamp列数据时,我按如下方式阅读:

String str = rs.getString(index);

我不想使用rs.getTimestamp()。现在,当我对Date列执行相同操作时,我得到一个适当的Date表示字符串。但是使用Timestamp我得到一个String如下:

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

我不明白为什么在毫秒之前引入一个空格。这使得我读取的时间戳不能通过预定义的时间戳格式进行解析。知道为什么我在毫秒之前得到一个空格?

2 个答案:

答案 0 :(得分:1)

好的,这就是我要去的地方,对我来说似乎是一个可行的解决方案。

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 ++;
}

答案 1 :(得分:0)

您正在对字符串进行隐式转换,因此格式由数据库会话的NLS_TIMESTAMP_FORMAT设置决定,该设置源自您的Java Locale。这是一种奇怪的格式,所以也许它被某种方式覆盖了。

由于您经常无法控制这些事情,并且您可能会在破坏代码的环境中发生意外更改,因此在查询中指定格式通常更安全。如果您确实需要使用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'来设置会话中的格式,但是您必须在每个会话中执行此操作(或使用登录触发器),并且可能在其他地方产生意外影响,尤其是在使用连接时池。以您想要的格式明确地从数据库中获取数据更加明显,如果其他人稍后更改某些内容,则不会中断。