当前位置:  数据库>oracle

ORA-01843与NLS_DATE_FORMAT问题分析

    来源: 互联网  发布时间:2017-05-12

    本文导语: 在Oracle SQL的where子句中传入字符类型参数'19-11月-08',使得可以直接和日期类型比较,或者转换一下同日期类型比较。 如果传入的字符格式和NSL_DATE_FORMAT一致,那么可以不转换直接用,否则会报ORA-01861错误。如果转换得不正确,...

在Oracle SQL的where子句中传入字符类型参数'19-11月-08',使得可以直接和日期类型比较,或者转换一下同日期类型比较。

如果传入的字符格式和NSL_DATE_FORMAT一致,那么可以不转换直接用,否则会报ORA-01861错误。如果转换得不正确,则可能会报ORA-01843或其他错误。

例如:

SQL> select count(*) from dba_objects where created>to_date('2008-12-01');
select count(*) from dba_objects where created>to_date('2008-12-01')

第 1 行出现错误:

 ORA-01861: 文字与格式字符串不匹配

SQL> select count(*) from dba_objects where created>to_date('19-11月-08','mm-dd-yyyy');
select count(*) from dba_objects where created>to_date('19-11月-08','mm-dd-yyyy')

第 1 行出现错误:
 ORA-01843: 无效的月份

 不能识别的字符串和格式转换不对的字符串测试时会出现这样的错误。


 使用to_date转换的格式字符串主要为'DD-MON-RR'/'DD-MON-RRRR'或'YYYY-MM-DD'/'YY-MM-DD'。


 如果能识别,正确的结果应是这样。

 SQL> select count(*) from dba_objects where created>'19-11月-08';

  COUNT(*)
 ----------
      4199

 这个格式和会话的NLS_DATE_FORMAT参数值相关。

 SQL> r
  1* select SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') DF, SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') DL from dual

 DF                  DL
 -------------------- --------------------
 DD-MON-RR            SIMPLIFIED CHINESE


 我们在会话级别修改一下这个参数的值。

 SQL> alter session set nls_date_format='YYYY-MM-DD';

 会话已更改。

 SQL> select count(*) from dba_objects where created>'19-11月-08';
 select count(*) from dba_objects where created>'19-11月-08'
                                                *
 第 1 行出现错误:
 ORA-01861: 文字与格式字符串不匹配

 这样,原来正确的操作就不对了。使用符合NLS_DATE_FORMAT格式的字符串则可以了。

 SQL> select count(*) from dba_objects where created>'2008-12-01';

  COUNT(*)
 ----------
      4199
     
这个参数和应用的环境也有关系,有的应用会自动修改这个参数值。因此,测试工作最好放到sqlplus中进行。

 数据库级别上这个参数的值是固定不变的,如下所示:

SQL> select * from v$nls_parameters;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                  SIMPLIFIED CHINESE
NLS_TERRITORY                  CHINA
NLS_CURRENCY                  ¥
NLS_ISO_CURRENCY              CHINA
NLS_NUMERIC_CHARACTERS        .,
NLS_CALENDAR                  GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              SIMPLIFIED CHINESE
NLS_CHARACTERSET              ZHS16GBK
NLS_SORT                      BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT          DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT            HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY              ¥
NLS_NCHAR_CHARACTERSET        AL16UTF16
NLS_COMP                      BINARY
NLS_LENGTH_SEMANTICS          BYTE
NLS_NCHAR_CONV_EXCP            FALSE

已选择19行。

NLS_DATE_LANGUAGE是"SIMPLIFIED CHINESE",即简体中文。所以月份值是中文如"11月"。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • [Oracle] 浅析令人抓狂的ORA-01555问题
  • 关于Oracle游标的问题(ORA-01000: maximum open cursors exceeded)
  • ORA-28002 Oracle 11g存在密码过期问题解决方案
  • oracle报错(ORA-00600)问题处理
  • Oracle 10g之ORA-32004问题
  • 出现ORA-01401和ORA-01008错误?
  • Eclipse连接Oracle数据库的ORA-00604 ORA-12705错误
  • oracle ORA-01114、ORA-27067错误解决方法
  • Oracle不能删除表 ORA-00604 ORA-01422 错误
  • 如何得到带有ora的行的下一行
  • ORA-12514及ORA-28547错误解决方案
  • 如何配置 linux 下 oracle 的 listener .ora 和
  • 浅析如何在tnsnames.ora中配置监听
  • Orcle的package中访问其它Schema的表报错ORA-00942解决方法
  • oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法
  • aq.executeQuery: ORA-00020: maximum number of processes (59) exceeded
  • Oracle 数据库闪回功能设置出现ORA-19809和ORA-19804错误
  • solaris10 安装 ora9.2.0.1 时报错
  • 在UNIX下,我的ORA817该怎么样才可以自己启动呀?
  • 基于ORA-12170 TNS 连接超时解决办法详解
  • plsql连接oracle数据库报ora 12154错误解决方法
  • 安装oracle出现error:ora-01031:insufficient privilleges的解决
  • 谁能帮忙解释一下: ORA-01000 : maximun open cursors exceeded
  • 我在Linux7。3下面装了一个Oracle8i,但是现在启动不起来了,总是报错ORA-01031: insufficient privileges
  • oracle 11g导出数据时报ORA 1455错误的处理方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,