使用Java 6从Oracle 10g读取Timestamp列数据时,我按如下方式阅读:
String str = rs.getString(index);
我不想使用rs.getTimestamp()
。现在,当我对Date列执行相同操作时,我得到一个适当的Date表示字符串。但是使用Timestamp我得到一个String如下:
2009-5-3 12:36:57. 618000000
我不明白为什么在毫秒之前引入一个空格。这使得我读取的时间戳不能通过预定义的时间戳格式进行解析。知道为什么我在毫秒之前得到一个空格?
答案 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'
来设置会话中的格式,但是您必须在每个会话中执行此操作(或使用登录触发器),并且可能在其他地方产生意外影响,尤其是在使用连接时池。以您想要的格式明确地从数据库中获取数据更加明显,如果其他人稍后更改某些内容,则不会中断。