`
mikixiyou
  • 浏览: 1098978 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353151
社区版块
存档分类
最新评论

ORA-01843与NLS_DATE_FORMAT问题分析

阅读更多

在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月"。

分享到:
评论

相关推荐

    如何解决ORA-01843与NLS_DATE_FORMAT问题

    ORA-01843 和 NLS_DATE_FORMAT 是在 Oracle 数据库中常见的错误,通常出现在日期处理时,尤其是当你尝试将非标准格式的日期字符串转换为日期类型时。这篇文章主要探讨了如何解决这类问题。 首先,`ORA-01843: 无效...

    ora-01460 错误原因分析

    ### ORA-01460 错误原因分析 #### 概述 在Oracle数据库操作过程中,可能会遇到ORA-01460错误,该错误全称为“ORA-01460: 转换请求无法实现或不合理”。这一错误通常发生在数据类型转换或者与操作系统之间的数据...

    设置ORACLE时间格式

    - 数据库初始化参数文件(init.ora):在Unix/Linux系统上,可以在`init<sid>.ora`文件中添加`NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS'`,然后重启数据库服务。 4. **TO_CHAR和TO_DATE函数** - Oracle提供了`...

    Oracle的NLS参数在开发与维护中的设置问题分析.pdf

    首先,文章提到的一个典型问题是在插入含有日期字段的记录时,由于日期格式不匹配导致的"ORA-01843:无效的月份"错误。这通常是因为输入的日期格式与Oracle会话默认的NLS_DATE_FORMAT不一致。通过`show parameters`...

    Oracle基于系统级触发器的审计功能

    - `NLS_DATE_FORMAT`:当前SESSION的日期格式。 - `NLS_DATE_LANGUAGE`:显示日期的语言。 - `NLS_SORT`:排序方式(BINARY或linguistic)。 - `CURRENT_USER`:当前SESSION拥有权限的用户的名称。 - `CURRENT_...

    Oracle服务器端日期时间格式设置

    - 新建一个名为`NLS_DATE_FORMAT`的字符串值,并为其指定期望的日期格式,如`'YYYY-MM-DD HH24:MI:SS'`。 #### 三、通过PL/SQL Developer调整 ##### 2. 使用PL/SQL Developer工具 对于经常使用的开发工具PL/SQL ...

    嵌入式开发数据库PROC*C

    2. **在INIT.ORA中设置**:可以在`INIT.ORA`文件中设置`NLS_DATE_FORMAT`参数,从而为所有会话提供一个默认的日期格式。 #### 预编译选项 为了使PROC*C程序能够更好地与Oracle数据库交互,需要设置合适的预编译...

    oracle设置日期格式

    1. **NLS_DATE_FORMAT**:这是一个非常重要的环境变量,用于控制日期在查询结果中的显示格式。 2. **日期格式字符串**:由一系列字符组成,用来定义日期的具体显示方式。例如,`'yyyy-MM-dd hh24:mi:ss'` 表示年份-...

    oracle笔记

    可以通过`TO_CHAR()`函数结合`NLS_DATE_FORMAT`设置来改变输出格式。 综上所述,这份Oracle笔记涉及到了基础的表创建、数据类型选择、数据插入、日期处理等多个方面,对于初学者来说是非常宝贵的参考资料。

    关于64位机器安装oracle客户端环境

    - **NLS_DATE_FORMAT**:用于指定日期格式。例如: ```plaintext 变量名: NLS_DATE_FORMAT 变量值: YYYY-MM-DD HH24:MI:SS ``` 这个设置将日期格式设为年-月-日 时:分:秒的形式。 2. **PATH环境变量的修改**...

    oracle详解

    NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN 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 TZH:TZM NLS_...

    Oracle Stream配置详细步骤

    - 设置 NLS_DATE_FORMAT 参数:`ALTER SYSTEM SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' SCOPE=SPFILE;` - 设置 STREAMS_POOL_SIZE 参数:`ALTER SYSTEM SET STREAMS_POOL_SIZE=300M SCOPE=SPFILE;` - 设置 ...

    oracle 10.2.0.1 精简客户端.msi.zip

    1、本软件可作为简单的Oracle10g客户端使用,包括:tnsping、exp、imp、sqlldr、sqlplus、tkprof(新增)等功能,如对客户端功能有更高的使用要求,请安装...>在注册表中加入NLS_DATE_FORMAT、NLS_TIMESTAMP_FORMAT等环

    不同操作系统修改oracle的默认日期格式

    SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMMDD'; ``` 这条命令将当前会话的日期格式设置为`YYYYMMDD`(例如:20230101)。此更改仅对当前会话有效,一旦退出该会话,设置将会被重置回系统默认值。这种方式...

    oracle 10.2.0.1 精简客户端

    1、本软件可作为简单的Oracle10g客户端使用,包括:tnsping、exp、imp、sqlldr...>在注册表中加入NLS_DATE_FORMAT、NLS_TIMESTAMP_FORMAT等环境变量 >修改了注册表中Oracle_Home写死路径的BUG >完善一些错误消息提示

    Oracle9i的init.ora参数中文说明

    说明: 与 NLS_TIME_FORMAT 相似, 只不过它设置的是 TIMESTAMP 数据类型的默认值, 该数据类型既存储YEAR, MONTH 和 DAY 这几个日期值, 也存储 HOUR, MINUTE 和 SECOND 这几个时间值。 语法: TIMESTAMP '1997-01-31 ...

    Oracle插入日期数据常见的2个问题和解决方法

    当尝试插入类似'01/06/2013'这样的日期时,Oracle可能会抛出“ORA-01843:无效的月份”的错误。这通常是因为Oracle无法识别提供的日期格式,因为默认的日期格式与输入的日期格式不符。Oracle数据库在处理日期时会使用...

    文档五、安装配置Oracle10g.pdf

    export ORACLE_BASE ORACLE_HOME ORACLE_SID ADMIN_HOME LOCAL_HOME NLS_DATE_FORMAT export MSGVERB NOMSGLABEL NOMSGSERVERITY NLS_LANG ORA_NLS33 DISPLAY LD_LIBRARY_PATH 五、磁盘空间分配 在安装 Oracle 10g...

    oracle 数据库常用命令大全

    - 客户端Windows系统,通过注册表设置`NLS_DATE_FORMAT`字符串值为`DD_MON_RR`或`RRRR`。 5. **处理用户被锁**: - 使用`v$session`、`v$lock`和`v$sqltext`视图查询锁定信息,确定被锁用户和锁住用户的SQL语句。...

Global site tag (gtag.js) - Google Analytics