使用Java从Oracle读取时间戳列。。rs.getString(索引)

使用Java从Oracle读取时间戳列。。rs.getString(索引),oracle,jdbc,timestamp,Oracle,Jdbc,Timestamp,在使用Java 6从Oracle 10g读取时间戳列数据时,我如下所示: String str = rs.getString(index); 2009-5-3 12:36:57. 618000000 我不想使用rs.getTimestamp()。现在,当我对日期列执行同样的操作时,我得到了日期的适当字符串表示形式。但使用时间戳,我得到一个字符串,如下所示: String str = rs.getString(index); 2009-5-3 12:36:57. 618000000 我不明

在使用Java 6从Oracle 10g读取时间戳列数据时,我如下所示:

String str = rs.getString(index);
2009-5-3 12:36:57. 618000000
我不想使用
rs.getTimestamp()
。现在,当我对日期列执行同样的操作时,我得到了日期的适当字符串表示形式。但使用时间戳,我得到一个字符串,如下所示:

String str = rs.getString(index);
2009-5-3 12:36:57. 618000000

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

你正在做一个到字符串的隐式转换,因此格式是由数据库会话的
NLS\u TIMESTAMP\u FORMAT
设置决定的,它是从Java语言环境派生的。这是一种奇怪的格式,所以可能它被某种方式覆盖了

由于您通常无法控制这些事情,并且您可能会在破坏代码的环境中得到意外更改,因此在查询中指定格式通常更安全。如果您确实需要使用
getString()
,而不是

select timestamp_field from ...
做点像

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

或者,您可以更改您的区域设置;或者在查询之前,通过执行
alter session set nls\u timestamp\u format='YYYY-MM-DD HH24:MI:SS.FF3'
在会话中设置格式,但您必须在每个会话中执行该操作(或使用登录触发器),并且可能会在其他地方产生意外影响,特别是在使用连接池的情况下。以您想要的格式显式地从数据库中获取数据更为明显,并且在以后其他人更改某些内容时不会中断。

好的,这就是我将要讨论的内容,对我来说似乎是一个可行的解决方案

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

没错,JDBC时间戳标准不包括空格。但是为什么不使用
rs.getTimestamp()
?最好不要质疑遗留代码:)感谢NLS格式信息。如果我知道哪个列将是时间戳数据类型,那么在查询本身中包含格式是一个不错的选择。但是,在这种情况下,表是动态生成的,列数据类型可能会有所不同。因此,不能在查询中使用格式。@akkyy只是出于兴趣,您当前的语言环境是什么;您是否能够在
nls\u session\u parameters
视图中查看会话的内容?了解它是如何获取该值的可能很有用,因为在您的代码中或在数据库的登录触发器中可能已经有设置格式的内容。如果您确实无法确定列类型,则调用
alter session
可能对您最安全(我想不可能从所有_tab_列中的列类型动态构建查询?)。但我担心的是,可能是其他人已经在设置它,而您可能会发生冲突,从而在其他地方造成问题。NLS_TIMESTAMP_FORMAT=DD-MON-RR HH.MI.SSXFFAM@akkyy-这是从您的应用程序中看到的,还是从其他客户端(例如SQL*Plus)看到的?我假设是后者。因此,要么您的区域设置设置了一个奇怪的值-从您的示例中看起来是
FMYYYY-MM-DD HH24:MI:SSX FF9
,要么您的代码中有什么东西正在为会话设置它。