"不是有效月份"或数字

0 sql oracle oracle11g

尝试将一些插入放入表中时出现此错误.

获取有关非有效月份的错误,当我尝试更改它时,我收到无效的数字错误.

ORA-01843: not a valid month ORA-06512: at "SYS.DBMS_SQL"
Run Code Online (Sandbox Code Playgroud)

码:

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);
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*off 5

使用DATE关键字和标准日期格式:

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);
Run Code Online (Sandbox Code Playgroud)

除了满足使用标准日期格式的要求外,这还可以防止您更改本地设置。

  • @John-无效数字与日期转换无关,它来自另一列。实际上,来自您的检查约束为ExpenseReport_CK2。仔细看看... (2认同)
  • @John-不,您看到两个不相关的问题。一旦解决了第一次遇到的日期问题,您就只能从约束中看到数字问题。 (2认同)

MT0*_*MT0 5

在您的DDL声明中:

CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus = 'PENDING'/'APPROVED'/'DENIED')
Run Code Online (Sandbox Code Playgroud)

应该:

CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus IN ( 'PENDING', 'APPROVED', 'DENIED' ) )
Run Code Online (Sandbox Code Playgroud)

当你试图插入检查约束正在评估值,并试图在三个字符串值执行除法操作'PENDING'/'APPROVED'/'DENIED'导致ORA-01722: invalid number.

一旦你改变它,然后使用TO_DATE('01/01/02','DD/MM/YY')(如你在评论中写的)或ANSI日期文字DATE '2002-01-01'应该在你的DML语句中工作.

(注意:小心使用2位数年份,或者您可以发现日期是在错误的世纪插入的.)