在ODI列映射中使用to_date功能时,日期值和数据库NLS里设置的值不一样
应用:
Oracle Data Integrator - 版本: 3.2.03.01 及以后发行的版本
本文档的信息可以应用到任何平台
现象
在运行ODI集合接口或者指定程序时,在同一个数据库不同客户端中使用下面的SQL指令,获得两种不同的结果:
select to_char(to_date('28082004','DDMMYYYY'),'D') from dual;
在第一种情况下,结果是7,而第二种情况的结果是6.到底哪出错了呢?
原因
因为数据转换功能是依赖于数据库NLS的参数(NLS_LANG, NLS_LANGUAGE, NLS_TERRITORY ...), 检查数据库和会话NLS的参数:
select * from v$nls_parameters;
解决方案
使用to_date功能的 'D', 'DAY' 或者 'DY'的函数格式,将会返回一个依赖于NLS_LANGUAGE 和 NLS_TERRITORY设置的值
例如:
如果NLS_TERRITORY 设置为 "AMERICA",问题描述中请求就会返回7;
如果NLS_TERRITORY 设置为 "FRANCE",,相同的请求就会返回6;
使用下面的SQL指令来修改NLS_TERRITORY oracle会话设置:
alter session set NLS_TERRITORY='FRANCE';
为了更准确,在执行SQL指令之前,设置NLS参数