【问题标题】:getString("daterow") returning different format from 10g to 11ggetString("daterow") 返回从 10g 到 11g 的不同格式
【发布时间】:2011-07-06 23:21:28
【问题描述】:

我有一个大型遗留应用程序,它调用 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 更新不会起作用。

【问题讨论】:

标签: java sql oracle jdbc


【解决方案1】:

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

Java: ResultSet getString() differs between environments

如果这是真的,那么唯一的解决方案似乎是:

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

  2. 将所有查询更改为使用 to_char(date, 'YYYY-MM-DD HH24:MI:SS.F')

有人看到其他解决方案吗?

【讨论】:

  • 是的,我也看到了,我意识到这需要更改代码。它很容易改变,我只是想避免它,因为它是一个遗留系统。
【解决方案2】:

你能在你的代码中这样做吗:

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

如果您有一个创建连接的中心点,您可以在那里进行。

(这是我目前找到的Oracle data/time literals 的来源。在某个地方可能有更清晰的来源。)

【讨论】:

  • 如果我调用 stmt.execute("alter session set nls_date_format('YYYY-MM-DD HH24:MI:SS.S')");我收到一个错误(缺少等号)。
  • 好的,我通过使用 = 修复了它,但它无法识别我的日期格式。知道我是怎么把 .S 放在最后的吗?
  • .FF 表示小数秒还是.SSSS 表示毫秒?
  • 您指定的格式是否生效?如果您使用“DD-MM-YYYY”,您会得到这样的结果吗?
  • 我也尝试将格式更改为其他格式,但它没有接受格式更改,请参阅编辑后的问题。
【解决方案3】:

在客户端环境中,将环境变量 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;

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

【讨论】:

  • 设置 NLS_DATE_FORMAT 没有任何作用。我试过使用环境变量以及调用alter session。
  • 客户端的环境变量?嗯。这对我有用:-/ 我想这是 Windows?
  • 不,原来的操作系统是 AIX 5.3,新的操作系统是 Redhat Linux。
猜你喜欢
  • 2013-03-15
  • 2018-05-22
  • 2011-12-15
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多