造成ORA-01843 无效的月份 的一些原因

本文介绍了解决Oracle数据库中ORA-01843错误的方法,该错误通常发生在日期转换过程中。通过调整客户端环境变量NLS_LANG及会话参数NLS_DATE_FORMAT,可以有效解决这一问题。

 1) 当我们在一个中文环境的客户端使用如下sql语句
INSERT INTO "temptable" ( DELIVER_DATE ) VALUES (TO_DATE('27-Jun-2007 15:57:30', 'DD-MON-YYYY HH24:MI:SS') )
Runtime error occurred: 1843 (ORA-01843: 无效的月份)
数据库会报告一个ORA-01843的错误,这是因为客户端是中文环境,格式mon就不能用英文的月份写法,必须用中文的“六月”
如果不想修改sql语句运行的话,就需要在执行该语句之前,使用alter session 命令将nls_date_language修改为american,如下:
alter session set nls_date_language='american'     --以英语显示日期
2)
今天出现了ORA-01843的错误.这个错误代表无效的月份一般在日期转化的时候会提示。
解决方法
alter session set NLS_DATE_FORMAT='DD-MON-YY';

可是今天我这样做还是不管用。实际上问题出在这里:

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
O:\>sqlplus greatfinish/finish
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 6月 21 19:18:00 2006
Copyright (c) 1982, 2002, Oracle Corporation.   All rights reserved.

连接到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
greatfinish@ORA920> select to_date('JAN 01 1988','MON DD YYYY') from dual;
select to_date('JAN 01 1988','MON DD YYYY') from dual
                *
ERROR 位于第 1 行:
ORA-01843: 无效的月份

greatfinish@ORA920> alter session set NLS_DATE_FORMAT='MON DD YYYY';
会话已更改。
--修改了NLS_DATE_FORMAT问题依然存在
greatfinish@ORA920> select to_date('JAN 01 1988','MON DD YYYY') from dual;
select to_date('JAN 01 1988','MON DD YYYY') from dual
                *
ERROR 位于第 1 行:
ORA-01843: 无效的月份
--查了一下sysdate发现原因了是客户端字符集问题
greatfinish@ORA920> select sysdate from dual;
SYSDATE
------------
6月   21 2006
greatfinish@ORA920> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开
O:\>set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
O:\>sqlplus greatfinish/finish
SQL*Plus: Release 9.2.0.1.0 - Production on Wed Jun 21 19:20:22 2006
Copyright (c) 1982, 2002, Oracle Corporation.   All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
--修改完毕成功select
greatfinish@ORA920> select to_date('JAN 01 1988','MON DD YYYY') from dual;
TO_DATE('
---------
01-JAN-88
greatfinish@ORA920>

转载于:https://www.cnblogs.com/yqskj/articles/2096490.html

<think>我们正在处理一个Oracle数据库错误:ORA-01843。这个错误通常与日期格式转换问题有关。 错误信息:ORA-01843: 无效月份 原因:当尝试将一个字符串转换为日期时,字符串中的月份部分无法被识别为有效的月份(例如,月份值不在1-12之间,或者字符串中的月份名称与数据库的NLS设置不匹配)。 解决方法: 1. 检查输入字符串的格式是否与数据库期望的日期格式匹配。 2. 使用TO_DATE函数并明确指定格式掩码(format mask)来转换字符串。 3. 检查数据库的NLS_DATE_FORMAT参数,了解当前会话的默认日期格式。 4. 确保在转换时,月份部分是正确的(例如,如果是英文月份缩写,要确保与数据库语言设置一致)。 示例:假设我们有一个字符串'15-13-2021',尝试转换为日期,由于月份13无效,会抛出ORA-01843。 正确的做法是使用明确的格式转换,例如: SELECT TO_DATE('15-12-2021', 'DD-MM-YYYY') FROM dual; 如果月份是名称,比如英文月份,则应该使用MON格式(例如'DD-MON-YYYY'),并且确保月份名称是数据库所识别的语言(比如英文数据库用'JAN'、'FEB'等)。 另外,如果是在应用程序中,建议使用显式转换以避免依赖于数据库的NLS设置。 现在,根据要求,在回答后提出3-5个相关问题。</think>### Oracle 错误 ORA-01843 解析 **错误说明** `ORA-01843: 无效月份` 表示 Oracle 无法将输入数据识别为有效的月份值。通常发生在以下场景: 1. **日期格式不匹配**:字符串与数据库的日期格式(如 `DD-MON-YYYY`)不一致。 2. **非法月份值**:月份数值超出 1-12 范围(如 `13`),或文本月份缩写错误(如 `JANX`)。 3. **隐式转换问题**:SQL 语句中未显式使用 `TO_DATE()` 函数,Oracle 自动转换失败。 --- ### 常见解决方法 #### 1. 显式指定日期格式 在 SQL 中使用 `TO_DATE()` 明确格式,例如: ```sql -- 正确示例 SELECT TO_DATE('2023-12-25', 'YYYY-MM-DD') FROM dual; ``` #### 2. 检查输入数据 - 数值月份:确保值在 `01`-`12` 之间(如 `07` 而非 `7`)。 - 文本月份:使用标准英文缩写(`JAN`/`FEB`/.../`DEC`),需与数据库语言一致。 #### 3. 修正 NLS 设置 检查当前会话的日期格式: ```sql SELECT value FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT'; ``` 临时修改格式(如 `DD-MON-YYYY`): ```sql ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY'; ``` #### 4. 验证数据源 若从外部文件导入,检查数据中的月份字段是否包含空格或特殊字符(如 `"DEC "`)。 --- ### 错误场景示例 **错误操作**: ```sql SELECT TO_DATE('2023-13-01', 'YYYY-MM-DD') FROM dual; -- 月份13无效 ``` **输出**: ``` ORA-01843: 无效月份 ``` **修正方案**: ```sql SELECT TO_DATE('2023-12-01', 'YYYY-MM-DD') FROM dual; -- 月份改为12 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值