2017-04-18 90 views
0

在尝试将几个插入到表中时出现此错误。“不是有效的月份”或编号

获取关于不是有效月份的错误,并且当我尝试更改它时发生无效数字错误。

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但有有没有运气尝试, 任何机会谁能看到我要去哪里错了。

+0

你是说'to_date('8/26/2002','mm/dd/yyyy')'不起作用吗? –

+0

香港专业教育学院还试图做这种方式 INSERT INTO ExpenseReport \t(艾尔诺,ERDesc,ERSubmitDate,ERStatusDate,ERStatus,SubmitUserNo,ApprUSerNo) \t VALUES(1, '销售简报',TO_DATE('01/01/02' , 'DD/MM/YY'),TO_DATE('02/02/03' , 'DD/MM/YY'), '已批准',3,4); – John

+1

@John - 当你这样做时发生了什么? (另外,你为什么在这个版本中使用2位数字的年份?你似乎也在切换日期和月份吗?) –

回答

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

除了使用标准的日期格式的满意度,这保护您免受在当地设置的变化。

+0

尝试使用那一段代码那里,我仍然得到这个错误ORA-01722:无效数字ORA-06512:在“SYS.DBMS_SQL”,行1721年 – John

+2

@约翰 - 无效的数字是无关的日期转换,这是来自另一列。实际上,从您的检查约束ExpenseReport_CK2开始。仔细看看... –

+0

@AlexPoole - 我有一个类似的列,没有日期,它的工作完美。我认为日期会把所有的东西都扔出去,有可能是因为我使用的是欧洲格式,不同的时间和日期格式会影响到这一点吗? – John

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.

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'; 
+0

您不应该依赖NLS设置或使用隐式转换。除了一次性的特殊代码之外,总是明确地声明格式 - 或者用'to_date()'和一个合适的掩码,或者最好 - 如戈登已经说过的 - 用日期文字。你的代码可以在你不能控制的客户端或会话中运行,所以不要让它有机会打破一些微不足道的东西。 –

相关问题