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

时间:2015-01-29 10:11:29

标签: sql oracle datetime insert

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

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

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:不是有效月份   01843. 00000 - “不是有效月份”

正如你所看到的,格式是匹配的,我无法弄清楚问题出在哪里......任何想法的人?

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

2 个答案:

答案 0 :(得分:10)

尝试将NLS_DATE_LANGUAGE指定为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更改它。

答案 1 :(得分:6)

虽然您使用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的编辑问题 -

  

我的日期语言参数设置为“FRENCH”。我可以将其更改为“AMERICAN”吗?

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

enter image description here