关于oracle多语言环境下to_date时间转换问题
2011-02-23 19:43 Peter Jin 阅读(658) 评论(0) 编辑 收藏 举报现象:
date_v date;
date_v := to_date('2010/11/16');--或'2010/11/16'
同一个服务器,不同oracle clinet 不一定都行得通。
原因:
不指定转换字符串的情况下,oracle使用既定的格式串进行日期转换操作,执行SELECT * FROM NLS_SESSION_PARAMETERS;
察看NLS信息,其中NLS_TIMESTAMP_FORMAT是指当前使用的格式化字符串。
(中文环境下):是"DD-MON-RR HH.MI.SSXFF AM",
其中,DD代表日,RR代表年mon代表月,所以to_date('2010/11/16')==to_date('2010/11/16','DD-MON-RR'),
MON在NLS_LANGUAGE为AMERICAN的情况下只识别Nov而不是别11,所以转换失败。
(日文环境下):是"RR-MM-DD HH24.MI.SSXFF",
所以to_date('2010/11/16')==to_date('2010/11/16',' RR-MM-DD'),
这样,在项目中的使用的日期格式包括SRC中format后的日期格式全部符合‘2010/11/16',所以执行正常。
解决:
常用的解决方案啊如下三个方法:
1,可以以DBA登录,执行:alter session set nls_date_format=’YYYY-MM-DD’
不过只是暂时会话性质的修改,服务器重启就还原了。
2、永久修改可以:
定位注册表到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1,然后新建一个reg_sz,名为NLS_DATE_FORMAT,值为YYYY-MM-DD。
3、最常用的就是我们项目中的解决方案:
to_date有个重载方法,提供转换需要的format。
无论NLS_DATE_FORMAT是什么,select to_date('2010/11/15','yyyy/mm/dd') from dual--ok。
注:感谢我的同事DICK的调查,谢谢。