2016-05-12 14 views
0

Ich habe die unten case-Anweisung, aber ich möchte hinzufügen, um die case-Anweisung, wo END_DT 1/1/3000 als Open zu klassifizieren.Oracle Case-Anweisung mit Datum Wert kein gültiger Monat

CASE WHEN x.END_dt IS NOT NULL OR REASON IS NOT NULL 
THEN 'Closed' ELSE 'Open' END AS Enrolled 

Ich erhalte die folgenden Ergebnisse, aber in diesem Fall soll dies als Open unter dem Eingeschriebene Spalte

ich zum Fall Statment habe versucht, indem eingestuft werden, aber ich Fehler bekommen.

Ein - inkonsistenter Datentyp; erwartet Datum hat Nummer Zwei - Wenn '1/1/3000' zum Datum hinzufügen - Kein gültiger Monat.

Hilfe wäre willkommen.

Tabelle

id End_dt   Reason Enrolled 
    1 1/1/3000    Closed 
+0

zeigen Bitte die eine vollständige, gültige SQL-Anweisung – OldProgrammer

Antwort

1

Dank für die Erinnerung mich über das ANSI-Standard Datumsformat mathguy. Ich änderte mein Beispiel so unter der Annahme x.END_dt ist ein Datentyp DATE:

CASE 
    WHEN x.END_dt = date '3000-01-01' 
     THEN 'Open' 
    WHEN x.END_dt IS NULL AND REASON IS NULL 
     THEN 'Open' 
    WHEN x.END_dt IS NOT NULL OR REASON IS NOT NULL 
     THEN 'Closed' 
    ELSE 'Unexpected x.END_dt value: ' || to_char(x.END_dt) 
    END AS Enrolled 

ich auch den Fall Aussage verschärft einen unerwarteten END_dt Wert zu handhaben und explizit Testbedingungen auf ihre eigenen ‚WHEN‘ Linien. Ich mache das so, weil die Absicht des Tests klar ist, es ist klar, welcher Ausdruck gerade getestet wird, wenn man einen Debugger (wie Toad) durchläuft, und wenn die Clients unweigerlich Dinge ändern wollen, ist es einfach, eine Zeile zu verschieben oder Ändern Sie die Reihenfolge der Tests, wenn sie auf ihren eigenen Linien sind.

+0

ich korrigiert stehen –

+0

Können Sie was erklären ‚Unexpected x.END_dt Wert:‘ || to_char (x.END_dt) macht? Vielen Dank! – Toby

+0

@Toby Er gibt die Nachricht mit dem END_dt-Wert zurück, der am Ende verkettet ist. Nur um zu zeigen, wie man mit einer Ausnahme umgehen kann. In Wirklichkeit würden Sie das nicht zurückgeben, sondern es protokollieren oder per E-Mail versenden. –

1

Um jede Abhängigkeit von NLS_DATE_FORMAT zu vermeiden, kann das ANSI-Standard-Datumsformat (das von Oracle unterstützt wird) verwendet werden: WHEN x.end_dt = date '3000-01-01' THEN .... Die ganze CASE Ausdruck kann wie so geschrieben werden:

CASE 
    WHEN x.end_dt = date '3000-01-01' OR (x.end_dt IS NULL AND x.reason IS NULL) 
    THEN 'Open' 
    ELSE 'Closed' 
END AS enrolled 
+0

Ich vergesse immer das ANSI-Standarddatum, danke dafür. Ich werde mein Beispiel oben aktualisieren. –

+0

Wenn ich zu ANSI-Standard-Datumsformat wechseln, erhalte ich einen Fehler - "Literal stimmt nicht mit Formatzeichenkette überein". '01 -JAN-3000 'funktioniert gut, aber warum sollte ich das ANSI-Standard-Datumsformat verwenden und wie behebe ich den Fehler? – Toby

+0

Können Sie bitte den Teil Ihrer Anfrage, wo Sie den Fehler erhalten - genau wie Sie es geschrieben haben? Das ANSI-Standarddatumformat verwendet KEINE Formatzeichenfolge, aber ich kann nicht sagen, was mit Ihrem Code falsch ist, wenn ich es nicht sehe. – mathguy

Verwandte Themen