2017-04-18 29 views
0

テーブルにいくつかの挿入を挿入しようとしているときにこのエラーが発生しました。「有効な月ではありません」または数字

有効な月ではなく、私はそれを変更しようとするとエラーが発生します。無効な番号のエラーが発生しています。

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

コード:私もTO_DATEを使用しますがそこには運を持っていない試した

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

、万が一 は、誰も私が間違って行くよ場所を確認することができます。

+0

to_date( '8/26/2002'、 'mm/dd/yyyy')は機能しません。 –

+0

アイブ氏はまた、このようにそれをやってみました INSERT INTO EXPENSEREPORT \t(ERNO、ERDesc、ERSubmitDate、ERStatusDate、ERStatus、SubmitUserNo、ApprUSerNo) \t VALUES(1、 'セールスプレゼンテーション'、TO_DATE('01/1月2' 日TO_DATE('02/02/03 '、' DD/MM/YY ')、' APPROVED '、3,4); – John

+1

@ジョン - あなたはそれをしたとき何が起こったのですか? (また、なぜあなたは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); 

を、これはローカル設定の変更保護されます。あなたのDDL文で

+0

そのコードを使用しようとしましたが、まだこのエラーが発生していますORA-01722:無効な数値ORA-06512:「SYS.DBMS_SQL」の行1721 – John

+2

@John - 無効な数値は日付変換とは関係ありません。別の列から来ています。実際、あなたのチェック制約ExpenseReport_CK2から。もっと密接にそれを見てください... –

+0

@AlexPoole - 私はこれと同じ列を日付なしで持っており、それは完全に動作しています。私は日付がこれですべてを投げ捨てていると思います。ヨーロッパ形式を使用しているので、時間と日付の異なるフォーマットがこれに影響する可能性がありますか? – John

5

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

は次のようになります。あなたがチェック制約が評価されている値を挿入しようとしていると、上の除算演算を実行しようとしている

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

3つの文字列値'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()'と適切なマスクのどちらか、あるいはゴードンがすでに述べたように、日付リテラルを使って書式を明示的に指定してください。あなたのコードは、あなたがコントロールしていないクライアントやセッションで実行することができるので、簡単なことを打破する機会を与えないでください。 –

関連する問題