ORA-01843: not a valid month 错误的解决方案

 服务器上的 Oracle 10g 使用中文字符集,所以按照如下的日期格式插入时,会提示你 ORA-01843 的错误。

SQL> Insert into BOOKSHELF_CHECKOUT

values
      ('DORAH TALBOT','MY LEDGER','15-FEB-02','03-MAR-02');
 
 
      ORA-01843: not a valid month

要解决这个问题,可以在修改当前会话的 NLS_DATE_LANGUAGE 和 NLS_DATE_FORMAT,方法如下

SQL>alter session set nls_date_language='AMERICAN';
 
       Session altered

当然如果要自定义日期格式,可以使用以下命令自定义:

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

Session altered

然后再次Insert into:

SQL> Insert into BOOKSHELF_CHECKOUT

values 

('GERHARDT KENTGEN','MIDNIGHT MAGIC','05-FEB-02','10-FEB-02');
 
        1 row inserted

没有报错,ok了。

NOTE:需要说明和注意的是,这两条命令是在当前会话下设置,只能在当前会话下生效,使用SHOW PARAMETER命令是看不到的,如果只是在当前需修改使用这两条命令就可以了,如果要全局修改就只能修改参数文件夹了.

 

转载自:http://bxffeng.blog.163.com/blog/static/9023844920104911855512/

### SQL 错误 'Not a Valid Month' 的解决方案 当遇到 `ORA-01843: not a valid month` 这一错误时,通常是因为日期格式不匹配或者数据输入不符合预期的日期模式。以下是详细的分析和解决方法: #### 1. **理解错误原因** 此错误表明数据库尝试解析一个字符串为日期时失败了,因为该字符串中的月份部分无法被识别为有效的月份[^1]。这可能是由于以下原因之一引起的: - 输入的数据格式与指定的 NLS_DATE_FORMAT 不一致。 - 使用了隐式的转换而非显式定义。 #### 2. **验证当前会话的日期格式设置** 可以通过查询系统的参数来确认当前使用的默认日期格式: ```sql SELECT value FROM nls_session_parameters WHERE parameter='NLS_DATE_FORMAT'; ``` 如果返回的结果显示的是类似于 `'DD-MON-RR'` 或其他形式,则需要确保所有的日期字符串都遵循这一特定格式[^2]。 #### 3. **修改会话级别的日期格式** 为了临时更改当前用户的日期解释方式而不影响整个数据库实例,可以执行如下命令调整会话级别的 NLS 参数: ```sql ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; -- 更改为ISO标准或其他适用格式 ``` #### 4. **应用 TO_DATE 函数强制指定格式** 即使已经设置了合适的全局或会话级别配置,在处理外部传入的数据时仍建议总是采用明确的方式进行转化。例如: ```sql INSERT INTO my_table (date_column) VALUES (TO_DATE('2023-03-15', 'YYYY-MM-DD')); ``` 这里通过提供第二个参数给 `TO_DATE()` 明确告知如何解读第一个参数的内容结构,从而避免任何潜在歧义引发异常情况发生。 #### 5. **检查并修正源表中的问题记录** 如果有批量导入操作涉及大量历史遗留数据可能存在脏数据的情况,则需先定位哪些具体行存在问题再做进一步清理工作前可考虑利用正则表达式辅助筛选可疑候选项比如查找所有非正常年份范围内的条目等等最后记得测试成功后再正式提交变更以免造成更大规模的影响[^1]. #### 结论 综上所述,针对 ORA-01843 错误的有效应对策略包括但不限于重新审视现有环境下的命名约定习惯;适时调优个人偏好设定以及始终贯彻良好编码实践即无论何时何地都要坚持运用精确控制手段代替随意猜测行为这样才能最大程度减少不必要的麻烦同时提高整体工作效率!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值