1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 数据库 - 正文

君子好学,自强不息!

现象:在多语言环境下使用过Oracle的同学想必都遇到过这样一个问题,

date_vdate; 
date_v:=to_date('2010/11/16');--或'2010/11/16'

同一个服务器,不同Oracle clinet 不一定都行得通。

原因: 不指定转换字符串的情况下,Oracle使用既定的格式串进行日期转换操作,执行SELECT * FROM NLS_SESSION_PARAMETERS;察看NLS信息,其中NLS_DATE_FORMAT是指当前使用的格式化字符串。我这里是"DD-MON-RR",dd代表日rr代表年mon代表月,所以to_date(‘2010/11/16’)==to_date(‘2010/11/16′,’DD-MON-RR’),

MON在NLS_LANGUAGE为AMERICAN的情况下只识别Nov而不是别11,所以转换失败。

解决: 既然知道问题原因了,解决这个问题有三个方法。

1,更改NLS_LANGUAGE会使NLS_DATE_FORMAT同步为相应的格式。我们这里需要japanese格式。我通过增加环境变量(NLS_LANG=JAPANESE_JAPAN.JA16SJIS)实现。

NLS_DATE_FORMAT变成RR-MM-DD了,测试,select to_date(‘2010/11/15’) from dual–ok。

2,增加环境变量NLS_DATE_FORMAT(RR-MM-DD或yy-mm-dd或yy/mm/dd任何你需要的格式)。

测试,select to_date(‘2010/11/15’) from dual–ok。

这里要注意经过我测试,rr和yy是一个意思 ,连接符号-和/都可以使转换成功。

更改NLS_LANGUAGE或NLS_DATE_FORMAT的方法可以google以下.

到这里基本大功告成了,但是你也许会说我们不能随便修改Oracle client的这些配置,因为其他实例也许需要它!下面是第三个方法

3,to_date有个重载方法,提供转换需要的format。

无论NLS_DATE_FORMAT是什么,select to_date(‘2010/11/15′,’yy/mm/dd’) from dual–ok。

但是还是不要高兴过早了,select to_date(‘2010/nov/15′,’yy/mon/dd’) from dual–不一定ok。

当NLS_LANGUAGE环境为AMERICAN时是OK的,为East Asia language时mon格式符真正识别的是11月(这里japan和china还是不一样的,看起来是一个字,但是从我机器输入select to_date(‘2010/11月/15′,’yy/mon/dd’) from dual却出错。

具体细节可以

本文来源:1818IP

本文地址:https://www.1818ip.com/post/10167.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。