代码改变世界

关于oracle多语言环境下to_date时间转换问题

2011-02-23 19:43  Peter Jin  阅读(645)  评论(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')

MONNLS_LANGUAGEAMERICAN的情况下只识别Nov而不是11,所以转换

(日文环境下):是"RR-MM-DD HH24.MI.SSXFF",

所以to_date('2010/11/16')==to_date('2010/11/16',' RR-MM-DD')

这样,在项目中的使用的日期格式包括SRCformat后的日期格式全部符合‘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的调查,谢谢。