getString(“daterow”)返回10g到11g的不同格式

时间:2011-06-27 16:04:19

标签: java sql oracle jdbc

我有一个大的遗留应用程序,它调用resultSet.getString(column),它调用的列是Oracle中的DATE格式。这段代码适用于Oracle 10g客户端。它将返回以下内容:

'2008-05-19 10:03:56.0'

但是,当我使用Oracle 11g客户端(服务器未更改)时,它提供以下内容:

'2008-05-19 10:03:56'

现在,我知道解决这个问题的正确方法是将代码更改为不使用getString作为日期函数,但这是一大堆代码,我们正在尝试这样做,而不必进行代码更改。

我可以使用任何配置参数在Oracle客户端修复此问题吗?

我尝试了以下内容,它甚至没有更改格式:

Statement stmt = conn.createStatement();
stmt.execute("alter session set nls_date_format = 'YYYY-MM-DD HH24:MI'");

这一次取消了秒数,但是在运行查询时它仍在使用秒钟。所以我认为NSL_DATE_FORMAT更新不会起作用。

3 个答案:

答案 0 :(得分:1)

下面的帖子似乎表明日期格式是在jdbc驱动程序中硬编码的:

Java: ResultSet getString() differs between environments

如果确实如此,那么唯一的解决方案似乎是:

  1. 更改所有代码以使用getDate()

  2. 更改要使用的所有查询to_char(日期,'YYYY-MM-DD HH24:MI:SS.F')

  3. 有没有人看到任何其他解决方案?

答案 1 :(得分:0)

您可以在代码中执行此操作:

alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS.F'

如果您有创建Connections的中心点,则可以在那里进行。

(这是我到目前为止Oracle data/time literals找到的来源。某处可能有更清晰的来源。)

答案 2 :(得分:0)

在客户端环境中,将环境变量NLS_DATE_FORMAT设置为您需要的格式并运行程序:

set NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS.F

编辑:

创建数据库触发器是否可行?

CREATE OR REPLACE TRIGGER data_logon_trigger
    AFTER LOGON
    ON DATABASE

BEGIN
   EXECUTE IMMEDIATE
   'alter session set nls_date_format = ''YYYY-MM-DD HH24:MI:SS.F'' ';
END;

这是一种强力方法 - 它会影响每次登录数据库。

相关问题