"不是有效月份"或号码

时间:2017-04-18 10:56:32

标签: sql oracle oracle11g

尝试将一些插入放入表格时出现此错误。

获取有关非有效月份的错误,当我尝试更改错误时,我会收到无效的号码错误。

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,但没有运气, 任何人都可以看到我出错的地方。

3 个答案:

答案 0 :(得分:5)

在您的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')(正如您在评论中所写)或ANSI日期文字DATE '2002-01-01'应该可以在您的DML语句中使用。

(注意:小心使用2位数年份,或者你可以找到dates are inserted with the wrong century.

答案 1 :(得分:4)

使用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);

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

答案 2 :(得分:0)

Check your date format: select sysdate from dual;

并按原样输入。 OR

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