【问题标题】:"Not a valid month" or number“不是一个有效的月份”或数字
【发布时间】:2017-09-14 04:18:39
【问题描述】:

尝试向表中插入一些插入时出现此错误。

收到关于无效月份的错误,当我尝试更改它时,我收到无效数字错误。

ORA-01843: not a valid month ORA-06512: at "SYS.DBMS_SQL"

代码:

CREATE TABLE ExpenseReport (
    ERNo            NUMERIC(10) NOT NULL, 
    ERDesc          VARCHAR(255) NOT NULL, 
    ERSubmitDate    DATE DEFAULT CURRENT_TIMESTAMP, 
    ERStatusDate    DATE NOT NULL, 
    ERStatus        VARCHAR(8) DEFAULT 'PENDING', 
    SubmitUserNo    NUMERIC(10) NOT NULL, 
    ApprUserNo      NUMERIC(10) NOT NULL, 
    CONSTRAINT ExpenseReport_CK1 CHECK (ERStatusDate >= ERSubmitDate), 
    CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus = 'PENDING'/'APPROVED'/'DENIED'), 
    CONSTRAINT ExpenseReport_PK1 PRIMARY KEY(ERNo), 
    CONSTRAINT ExpenseReport_FK1 FOREIGN KEY(SubmitUserNo) REFERENCES Users(UserNo), 
    CONSTRAINT ExpenseReport_FK2 FOREIGN KEY(ApprUserNo) REFERENCES (USerNo)
); 

INSERT INTO ExpenseReport 
    (ERNo, ERDesc, ERSubmitDate, ERStatusDate, ERStatus, SubmitUserNo, ApprUSerNo)
    VALUES (1,'Sales Presentation','8/10/2002','8/26/2002','APPROVED',3,4);

我也尝试过使用TO_DATE,但没有运气, 任何人都可以看到我哪里出错了。

【问题讨论】:

  • 你是说to_date('8/26/2002' , 'mm/dd/yyyy') 不起作用?
  • 我也试过用这种方式插入到 ExpenseReport (ERNo, ERDesc, ERSubmitDate, ERStatusDate, ERStatus, SubmitUserNo, ApprUSerNo) VALUES (1,'Sales Presentation',TO_DATE('01/01/02 ','DD/MM/YY'),TO_DATE('02/02/03','DD/MM/YY'),'APPROVED',3,4);
  • @John - 当你这样做时发生了什么? (另外,为什么你在这个中使用 2 位数的年份?你似乎也有切换日期和月份?)
  • @AlexPoole - 只是想尽一切办法让它发挥作用,我尝试了多年的 2 位数字和基于我在其他问题上看到的 4 位数字。由于某种原因,我不断收到有关月份数的错误
  • 您在该评论中显示的代码不会引发该错误。如果你混淆了几天和几个月,你通常会明白这一点,通常是隐含的,就像你在问题中的原始陈述一样。

标签: sql oracle oracle11g


【解决方案1】:

使用DATE keyword 和标准日期格式:

INSERT INTO ExpenseReport (ERNo, ERDesc, ERSubmitDate, ERStatusDate, ERStatus, SubmitUserNo, ApprUSerNo)
    VALUES (1, 'Sales Presentation', DATE '2001-08-10', DATE '2001-08-2006', 'APPROVED', 3, 4);

除了使用标准日期格式的满意度之外,这还可以保护您免受本地设置的更改。

【讨论】:

  • 尝试在那里使用那段代码,但我仍然收到此错误 ORA-01722: invalid number ORA-06512: at "SYS.DBMS_SQL", line 1721
  • @John - 无效数字与日期转换无关,它来自另一列。实际上,来自您的检查约束 ExpenseReport_CK2。仔细看看……
  • @AlexPoole - 我有一个与此类似的列,但没有日期,并且运行良好。我认为日期把所有东西都扔掉了,当我使用欧洲格式时,时间和日期的不同格式是否可能会影响这一点?
  • @John - 不,您看到了两个不相关的问题。只有在修复了它首先遇到的日期问题后,才能从约束中看到数字问题。
【解决方案2】:

在您的 DDL 语句中:

CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus = 'PENDING'/'APPROVED'/'DENIED')

应该是:

CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus IN ( 'PENDING', 'APPROVED', 'DENIED' ) )

当您尝试插入值时,正在评估检查约束并尝试对三个字符串值执行除法运算'PENDING'/'APPROVED'/'DENIED',结果为ORA-01722: invalid number

一旦更改此设置,然后使用 TO_DATE('01/01/02','DD/MM/YY')(如您在 cmets 中所写)或 ANSI 日期文字 DATE '2002-01-01' 应该可以在您的 DML 语句中使用。

(注意:请小心使用 2 位数年份,否则您会发现 dates are inserted with the wrong century.

【讨论】:

    【解决方案3】:
    Check your date format: select sysdate from dual;
    

    并按显示输入。或

    change your date format: alter session set nls_date_format= 'DD-Mon-YYYY HH24:MI:SS';
    

    【讨论】:

    • 您不应依赖 NLS 设置或使用隐式转换。除了一次性的临时代码外,始终明确说明格式 - 使用 to_date() 和合适的掩码,或者最好 - 正如 Gordon 已经说过的 - 使用日期文字。您的代码可能会在您无法控制的客户端或会话中运行,因此不要给它机会打破琐碎的事情。
    【解决方案4】:

    这很容易: 如果你的代码像这样只是删除下摆并写下它

    示例: 您的代码:值('30178','K111','22/12/2008') 执行此操作:值 ('30178','K111', '22/Dec/2008')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多