我有一个大的遗留应用程序,它调用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更新不会起作用。
答案 0 :(得分:1)
下面的帖子似乎表明日期格式是在jdbc驱动程序中硬编码的:
Java: ResultSet getString() differs between environments
如果确实如此,那么唯一的解决方案似乎是:
更改所有代码以使用getDate()
更改要使用的所有查询to_char(日期,'YYYY-MM-DD HH24:MI:SS.F')
有没有人看到任何其他解决方案?
答案 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;
这是一种强力方法 - 它会影响每次登录数据库。