【问题标题】:Reading Timestamp column from Oracle using Java.. rs.getString(index)使用 Java 从 Oracle 读取时间戳列.. rs.getString(index)
【发布时间】:2012-02-21 12:12:12
【问题描述】:

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

String str = rs.getString(index);

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

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

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

【问题讨论】:

  • 你说得对,时间戳的 JDBC 标准不包括空格。但是为什么不使用rs.getTimestamp() 读取时间戳呢?
  • 遗留代码最好不要质疑:)

标签: oracle jdbc timestamp


【解决方案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 ++;
}

【讨论】:

    【解决方案2】:

    您正在对字符串进行隐式转换,因此格式由数据库会话的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' 来设置会话中的格式,但是您必须在每个会话中都这样做(或使用登录触发器),并且它可能会在其他地方产生意想不到的影响,特别是在使用连接池的情况下。以您想要的格式从数据库中显式获取数据更为明显,并且如果其他人稍后更改某些内容也不会中断。

    【讨论】:

    • 感谢您提供 NLS 格式信息。如果我知道哪一列将是 Timestamp 数据类型,那么在查询本身中包含格式是一个不错的选择。但是,在这种情况下,表是动态生成的,列数据类型可能会有所不同。因此,不能在查询中使用格式。
    • @akkyy 只是出于兴趣,您当前的语言环境是什么;你能在nls_session_parameters 视图中看到你的会话有什么吗?了解它是如何获取该值可能很有用,因为可能已经在您的代码中或在数据库中的登录触发器中设置了格式。
    • 如果您真的无法确定列类型,调用alter session 可能对您最安全(我猜想从 all_tab_columns 中的列类型动态构建查询是不可能的?)。但我担心其他人已经在设置它并且您可能会发生冲突,从而导致其他地方出现问题。
    • NLS_TIMESTAMP_FORMAT = DD-MON-RR HH.MI.SSXFF AM
    • @akkyy - 是从您的应用程序中看到的,还是从另一个客户端(例如 SQL*Plus)看到的?我假设后者。因此,要么您的 Locale 设置了一个奇怪的值 - 从您的示例中似乎是 FMYYYY-MM-DD HH24:MI:SSX FF9 - 要么您的代码中的某些内容正在为会话设置它。
    猜你喜欢
    • 2015-05-10
    • 2018-07-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2015-02-07
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多