【问题标题】:Oracle insert failure : not a valid monthOracle 插入失败:不是有效月份
【发布时间】:2015-03-28 12:25:16
【问题描述】:

我正在尝试从包含日期列的 .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”吗?

【问题讨论】:

  • select * from nls_session_parameters where parameter = 'NLS_DATE_LANGUAGE'; 它有什么作用?也许,数据库的语言不是美式的。
  • 表定义是什么样的?
  • @MaheswaranRavisankar,正是我要说的,但我宁愿将其发布为答案。
  • @Traffy,是的,当然您可以更改参数值。已给出两个选项作为答案。阅读docs.oracle.com/database/121/NLSPG/ch3globenv.htm#NLSPG003

标签: sql oracle datetime insert


【解决方案1】:

尝试将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 更改它。

【讨论】:

    【解决方案2】:

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

    我的日期语言参数设置为“法语”。可以改成“AMERICAN”吗?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多