Oracle: Probleme mit View

Ich habe eine Tabelle mit diversen Textspalten (Bereich, GG, GZ, Abt1, Abt2, Abt3) sowie einer Datumspalte „Projekt_Planende“.
Um nun das Geschäftsjahr herauszufinden (beginnt bei uns dummerweise am 01. Oktober!), habe ich mir einen View überlegt, der zusätzlich die Spalten GJAHR und GMONAT aus der Datumsspalte errechnet und mit ausgibt, und zwar mit folgender Überlegung:

Zum Datum addiere ich 92 Tage (31 für Oktober und Dezember, 30 für November) und erhalte somit eine Jahresangabe, die 1 größer als das aktuelle Geschäftsjahr ist; ziehe danach noch 1 ab und erhalte so das tatächliche Geschäftsjahr (z.B. 2003 für den Datumsbereich 01.10.2003 bis 30.09.2003).
Den Geschäftsmonat (der Geschäftsmonat 1 in einem Geschäftsjahr ist der Oktober) erhalte ich für Oktober bis Dezember mittels der Decode-Anweisung und für die übrigen Monate durch Addition von 3 - das funktioniert auch.

Soweit so gut. Der View lässt sich compilieren, und ich kann auch darauf selektieren. Sobald ich aber den Select mit einer Einschränkung auf das GJAHR ausführe, bekomme ich die Fehlermeldung: „ORA-01841: (full) year must be between -4713 and +9999, and not be 0“.

Folgender Select geht:
SELECT bereich, gg, gz, abt1, abt2, abt3, gmonat, gjahr, pplanende
FROM vforecast
WHERE pplanende > TO_DATE(‚01.10.2002‘,‚DD.MM.YYYY‘);

Folgender Select bringt den besagten Fehler:
SELECT bereich, gg, gz, abt1, abt2, abt3, gmonat, gjahr, pplanende
FROM vforecast
WHERE pplanende > TO_DATE(‚01.10.2002‘,‚DD.MM.YYYY‘);

Hier die View-Definition. Gibts hier irgendeinen groben Schnitzer, den ich übersehen habe?

CREATE OR REPLACE VIEW vforecast (
bereich,
gg,
gz,
abt1,
abt2,
abt3,
gjahr,
gmonat,
pplanende )
AS
SELECT
Bereich, GG, GZ, Abt1, Abt2, Abt3,
TO_NUMBER(TO_CHAR(Projekt_Planende + 92,‚YYYY‘)) - 1,
TO_NUMBER(DECODE(TO_CHAR(Projekt_Planende, ‚MM‘), ‚10‘, ‚1‘, ‚11‘, ‚2‘, ‚12‘, ‚3‘,
TO_CHAR(3 + TO_NUMBER(TO_CHAR(Projekt_Planende,‚MM‘))))),
Projekt_Planende
FROM
VProjekte_6s
WHERE
Projekt_Planende IS NOT NULL
AND Status != ‚EINGESTELLT‘
/

Ciao,
Ralf

Hallo Ralf,

Folgender Select geht:
SELECT bereich, gg, gz, abt1, abt2, abt3, gmonat, gjahr, pplanende
FROM vforecast
WHERE pplanende > TO_DATE(‚01.10.2002‘,‚DD.MM.YYYY‘);

Folgender Select bringt den besagten Fehler:
SELECT bereich, gg, gz, abt1, abt2, abt3, gmonat, gjahr, pplanende
FROM vforecast
WHERE pplanende > TO_DATE(‚01.10.2002‘,‚DD.MM.YYYY‘);

Wo ist der Unterschied?

Gruß, muzel

Hallo,

ich seh auch nix, aber der Fehler taucht dann auf, wenn ein Zwischenergebnis bei der Datumsumwandlung falsch ist.

Vermutlich im SELECT. Hast Du das richtige Format für GJAHR (NUMBER) genommen?

Die beiden Selects, die Du angegeben hast sind identisch. (Oder ich bin blind)

Gruß

peter

Wo ist der Unterschied?

Oh Sch… okay, also bei dem Select der nicht geht, hatte ich noch drin „…AND GJAHR=2003“. Also immer wenn im Select GJAHR in der Where-Bedingung eingeschränkt wird, kommt die Fehlermeldung.

Gruss
Ralf

Habe den Fehler nach einem dreiviertel Tag Suche selbst gefunden: Irgendein Hirnheiner hat in der Tabelle tatsächlich in einem Datensatz als DAtum den 31.12.9999 hinterlegt, d.h. das größtmögliche Datum für Oracle. Und wenn man dann noch 92 Tage addiert, kracht’s eben.

Ich habe den View noch umgebaut und schließe jetzt alle Zeilen aus, die ein Datum > Jahr 3000 haben. Jetzt klappt’s.

Danke trotzdem.

Ciao,
Ralf