2017-04-18 70 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()'和一個合適的掩碼,或者最好 - 如戈登已經說過的 - 用日期文字。你的代碼可以在你不能控制的客戶端或會話中運行,所以不要讓它有機會打破一些微不足道的東西。 –

相關問題