Oracle 插入失败:不是有效的月份

Oracle insert failure : not a valid month

我正在尝试从包含日期列的 .xlsx 电子表格导入数据。在这些列中,日期以 DD-MON-YY 格式显示(例如:20-AUG-12)。

当我运行使用导入向导时,一切正常,直到我必须精确 columns/fields 映射。我有一个免责声明说所选格式与 table 字段定义不匹配(我的字段是日期字段)。插入脚本示例:

INSERT INTO simulation 
            (simulation_id, 
             simulation_name, 
             sim_start_date, 
             sim_end_date, 
             status, 
             last_run_date, 
             moddat, 
             modusr, 
             notification_email) 
VALUES      (251.0, 
             'Proposal Test', 
             To_date('01-DEC-11', 'DD-MON-YY'), 
             To_date('31-DEC-11', 'DD-MON-YY'), 
             'C', 
             To_date('09-AUG-12', 'DD-MON-YY'), 
             To_date('09-AUG-12', 'DD-MON-YY'), 
             'Brent Weintz', 
             'bweintz@carlsonwagonlit.com'); 

当我尝试 运行 此查询时,出现以下错误:

ORA-01843: not a valid month 01843. 00000 - "not a valid month"

如您所见,格式是匹配的,我不知道问题出在哪里...有什么想法吗?

编辑:我的日期语言参数设置为 "FRENCH"。我可以将其更改为 "AMERICAN" 吗?

虽然您正在使用 to_date 和正确的格式模型来显式转换为日期,但仍然得到 ORA-01843 似乎问题出在 NLS_DATE_LANGUAGE 上。阅读更多相关信息 here

SQL> DROP TABLE t PURGE;

Table dropped.

SQL> CREATE TABLE t(A DATE);

Table created.

SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='FRENCH';

Session altered.

SQL> SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_LANGUAGE';

PARAMETER            VALUE
-------------------- ----------
NLS_DATE_LANGUAGE    FRENCH

SQL> INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy'));
INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy'))
                             *
ERROR at line 1:
ORA-01843: not a valid month

所以,我遇到了 NLS_DATE_LANGUAGE 不正确的错误。我们将其设置为 AMERICAN

SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';

Session altered.

SQL> SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_LANGUAGE';

PARAMETER            VALUE
-------------------- ----------
NLS_DATE_LANGUAGE    AMERICAN

SQL> INSERT INTO t VALUES(to_date('01-jan-2012','dd-mon-yyyy'));

1 row created.

SQL>

更新 到 OP 的编辑问题 -

My date language paramater is set to "FRENCH". Can I change it to "AMERICAN" ?

来自documentation以下是设置NLS参数的方法。注意优先顺序。

尝试指定NLS_DATE_LANGUAGE as a paremeter for the TO_DATE函数。

INSERT INTO simulation 
            (simulation_id, 
             simulation_name, 
             sim_start_date, 
             sim_end_date, 
             status, 
             last_run_date, 
             moddat, 
             modusr, 
             notification_email) 
VALUES      (251.0, 
             'Proposal Test', 
             To_date('01-DEC-11', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'),
             To_date('31-DEC-11', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'), 
             'C', 
             To_date('09-AUG-12', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'), 
             To_date('09-AUG-12', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = AMERICAN'), 
             'Brent Weintz', 
             'bweintz@carlsonwagonlit.com'); 

当然,如果你要执行几个查询,你可以用alter session来改变它。