浅析Oracle多语言环境下to_date时间转换

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

date_v&">nbsp;date;  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却出错。

具体细节可以参考文章http://www.eygle.com/special/NLS_CHARACTER_SET_05.htm

现在问题明白了,但解决方法这么多,难道转换一个字符串到日期真的这么周折?

我选择第三个方法,因为它是我能控制的。select to_date(‘2010/11/15′,’yy/mm/dd’) from dual–ok,因为mm的转译永远是阿拉伯数字啊。

案例:这样一个情景,现在有个存储要部署在未知地理未知服务器上,它需要一个date参数,plsql程序员想当然的吧它定义成了date,不巧,调用存储的另一个程序员是个想通过脚本来调用存储,并且通过windows计划任务触发脚本执行,这个脚本给了一个2010/11/15,看起来没任何问题,但是不巧这台应用服务器的Oracle客户端的NLS_LANGUAGE=AMERICAN,真是无巧不成书啊,当Oracle做这样一个调用前的参数转换工作的时候 date_v date; date_v := ‘2010/11/16’(这个转换是默认的不可控的);灾难来临了。

怎么避免这样的灾难呢?参数改成nvarchar吧,自己做参数转换,使用上面我们的第三个解决方法data_v:= to_date(data_vchar,’yy/mm/dd’),其实灾难可以避免。

有人会说,调用存储的人传了个2010¥/11……/16!怎么办,你的yyyy/mm/dd如何处理?当然没法处理,我的方法是给出一个准确的文档告诉对方参数应该是什么格式的,出错了也可以排除责任了。 另外我自己转换可以添加一些异常机制来提示问题,Oracle自动转换出错了可是很霸道的。

时间: 2025-01-21 12:51:46

浅析Oracle多语言环境下to_date时间转换的相关文章

基于Selenium WebDriver实现多语言环境下自动化截图

TVT 的概念和 TVT 自动化的必要性 概念 翻译验证测试 (Translation Verification Testing,TVT) 是 IBM GSSC 部门为 IBM 的各种产品做本地化 (Localization) 的一个测试环节.众所周知,我们开发出一款产品,需要让全 球各地的用户都能够无障碍的使用,就必须精准的将产品 UI 和相关文档翻译成各种语言,这样不同国家和地区的用户才能 够顺畅使用.TVT 的过程就是一个产品翻译验证测试的过程. 必要性 从字面上看,TVT 是一个比较简单

算12 三个数 加减乘除-在C语言环境下的算12问题

问题描述 在C语言环境下的算12问题 给定三个数,问你使用加减乘除能否得到12,要求三个数的顺序可以改变,计算的中间结果必须为整数.输入:输入三个整数,均大于0,小于1000.输出:输出为一个整数,当可以得到12时输出1,否则输出0.输入样例:2 2 3输出样例:1提示:输出格式:printf(""%dn""1);主要功能:(1)从文件中读出题目的输入:(2)向屏幕上打印出题目的计算结果. PS:最好能有多文件结构多函数结构,能有界面处理(这些我还不太会,所以只能附

Oracle 11g RAC环境下Private IP修改方法及异常处理

Oracle 11g RAC环境下Private IP修改方法及异常处理 Oracle 11g RAC环境下Private IP修改方法及异常处理 一. 修改方法 1. 确认所有节点CRS服务以启动 # olsnodes -s -n –i host1 1 host1-vip Active host2 2 host2-vip Active 2. 修改Private IP配置信息 如果之前只有一个私有网卡,则直接删除时会报错,如:PRIF-31: Failed to delete the speci

Oracle RAC学习环境下的Centos系统BUG解决

在上个礼拜工作期间利用三台破PC机器很老很老的那种,搭建了一个RAC的学习环境很是欣喜不已,这嘛,既利用了废旧硬件,也为自己创造了学习环境,一举多得,当然高兴了哈! 在这个礼拜一的早上我,打算在这个学习环境下做点儿什么.可是刚刚登陆到其中的 一台主机中的时候报告了错误,如下图: 心想这下子玩完了. 于是重启系统,大约过了一分钟后,登录系统,没什么问题,,不一会儿就又出现了上面的问题. 这么久了还没见过linux崩溃过(除了在一台Dell 750的机器上安装centos 5.2,硬件不支持,害我重

Oracle 数据库灾难性环境下恢复实例

一.版本和数据库文件信息 1.Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production 2.PL/SQL Release 11.2.0.3.0 - Production 3.CORE 11.2.0.3.0 Production 4.TNS for Linux: Version 11.2.0.3.0 - Production 5.NLSRTL Version 11.2.0.3.0 - Productio

浅析Oracle全表扫描下的逻辑读

T1表全表扫描产生逻辑读的分析 做个实验给你演示一下:以表t1为例,对段t1做dump 1.t1表就一条数据 gyj@OCM> select * from t1;      ID NAME ---------- ----------       1 AAAAA 2.找t1段的段头块 gyj@OCM> select  header_file,header_block from dba_segments where segment_name='T1' and owner='GYJ'; HEADER

详解Oracle RAC 环境下的连接管理

这篇文章详细介绍了Oracle RAC环境下的连接管理,分别介绍了什么是 Connect Time Load Balancing.Runtime Connection Load Balancing.Connect Time Connection Failover 和 Runtime Connection Failover,以及里面所涉及到的 TAF.ONS.FCF.FAN.LBA 等诸多知识点.本文主要是针对 Oracle RAC 11gR2 环境下的连接管理,但同时也会对比说明一下 Oracl

举例简介AngularJS的内部语言环境

  这篇文章主要介绍了AngularJS的内部语言环境,展示不同语言环境下对货币或是日期等文本方面所产生的影响,需要的朋友可以参考下 AngularJS支持内置的国际化三种类型的过滤器货币,日期和数字.只需要根据国家的区域纳入相应的JS.默认情况下它处理浏览器的语言环境.例如,要使用丹麦语的语言环境,使用下面的脚本 ? 1 <script src="https://code.angularjs.org/1.2.5/i18n/angular-locale_da-dk.js">

Oracle 11g RAC 环境下单实例非缺省监听及端口配置

      如果在Oracle 11g RAC环境下使用dbca创建单实例数据库后,Oracle会自动将其注册到缺省的1521端口及监听器.大多数情况下我们使用的为非缺省监听器以及非缺省的监听端口.而且在Oracle 11g RAC环境中,对于集群监听器的配置由grid用户来接管了.基于这种情形的单实例非缺省监听及端口该如何配置呢?本文给出了解决方案,并且使用了静态及动态两种注册方法.              关于单实例下非缺省监听及端口的配置可以参考下面的文章.实际上参照下列文章依旧可以完成