2017-04-18 6 views
0

Erhalte diesen Fehler beim Versuch, ein paar Beilagen in eine Tabelle zu schreiben."Kein gültiger Monat" oder Nummer

Es wird ein Fehler in Bezug auf nicht einen gültigen Monat und wenn ich versuche, es zu ändern, bekomme ich ungültige Nummer Fehler.

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

Code:

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

ich auch die TO_DATE versucht haben, verwenden, aber kein Glück dabei zu haben, durch Zufall kann man sehen, wo ich falsch gehe.

+0

sagst du, 'to_date ('8/26/2002 ',' mm/dd/yyyy ')' funktioniert nicht? –

+0

Ive auch versucht, es auf diese Weise INSERT INTO ExpenseReport \t (ERNO, ERDesc, ERSubmitDate, ERStatusDate, ERStatus, SubmitUserNo, ApprUSerNo) \t VALUES (1, 'Sales Presentation', TO_DATE ('01/01/02' tun, "TT/MM/JJ"), TO_DATE ('02/02/03 ',' TT/MM/JJ '),' APPROVED ', 3,4); – John

+1

@John - und was ist passiert, als du das getan hast? (Auch warum benutzt du 2-stellige Jahre in diesem? Du scheinst Tag und Monat umgestellt zu haben?) –

Antwort

4

Verwenden Sie die DATE keyword und Standarddatumsformate:

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

Zusätzlich zur Zufriedenheit der Standarddatumsformate verwenden, dies schützt Sie vor Änderungen der lokalen Einstellungen.

+0

versucht, mit diesem Bit Code dort und ich bekomme immer noch diesen Fehler ORA-01722: ungültige Nummer ORA-06512: bei "SYS.DBMS_SQL", Zeile 1721 – John

+2

@John - ungültige Nummer hat nichts mit der Datumsumwandlung zu tun, das ist aus einer anderen Spalte kommen. In der Tat, von Ihrer Check-Constraint ExpenseReport_CK2. Schauen Sie sich das genauer an ... –

+0

@AlexPoole - Ich habe eine ähnliche Spalte wie diese ohne das Datum und es funktioniert perfekt.Ich denke, das Datum wirft alles aus, ist es möglich, dass verschiedene Formate für Zeit und Datum dies beeinflussen, da ich das europäische Format verwende? – John

5

In Ihrer DDL-Anweisung:

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

Sollte sein:

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

Wenn Sie versuchen, Werte der Check-Constraint ausgewertet wird eingefügt, und es wird versucht, eine Divisionsoperation auf die auszuführen drei Zeichenfolgenwerte 'PENDING'/'APPROVED'/'DENIED', die ORA-01722: invalid number ergibt.

Sobald Sie dies ändern dann mit TO_DATE('01/01/02','DD/MM/YY') (wie Sie in Kommentare geschrieben) oder ein ANSI-Datum Literal DATE '2002-01-01' sollte in Ihren DML-Anweisungen funktionieren.

(Hinweis: Seien Sie vorsichtig mit 2-stelligen Jahren oder Sie können, dass dates are inserted with the wrong century. finden)

0
Check your date format: select sysdate from dual; 

und geben, wie es zeigen. ODER

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

Sie sollten sich nicht auf die NLS-Einstellungen verlassen oder implizite Konvertierungen verwenden. Außer für einmaligen Ad-hoc-Code, geben Sie das Format immer explizit an - entweder mit 'to_date()' und einer geeigneten Maske oder vorzugsweise - wie Gordon bereits sagte - mit Datumsliteralen. Ihr Code könnte in einem Client oder einer Sitzung ausgeführt werden, die Sie nicht kontrollieren, also geben Sie ihm keine Gelegenheit, etwas Triviales zu durchbrechen. –

Verwandte Themen