[Oracle 10] Datum von Datum abziehen

m3000

Erfahrenes Mitglied
Ich möchte ein Datum von einem anderen im gleichen record abziehen. Dabei suche ich nach Sätzen, bei denen die Differenz maximal einen Monat beträgt. Beide Datumsfelder sind vom Typ NUMBER(8). Sie enthalten keine völlig kaputten Einträge, inhaltlich gehen sie von 19180101 bis 20991231. Das statement geht so:
Code:
select feld1, feld2
from tab
where (to_date(datumfeld1,'yyyymmdd') - to_date(datumfeld2,'yyyymmdd')) <= 30;
Wenn ich die Abfrage mit where systemnummer=nnn auf mir bekannte Sätze einschränke, klappt das auch. Das bedeutet, dass die Syntax eigentlich ok ist. Wenn ich die Abfrage aber auf die ganze Tabelle loslasse, erscheint die Fehlermeldung.
ORA-01839: date not valid for month specified

Kann das an Schaltjahren oder sowas liegen? Wie klappt die Berechnung über die ganze Tabelle?

Dank und Gruss
Marcus
 
Hatte nichts mit Schaltjahren zu tun. Es gab falsche Daten in den Feldern wie zB 31. November. Die Umrechnung ist an dieser Plausibilitätsprüfung gescheitert. Und logisch: Das eigentliche Problem ist, dass solche Werte entstehen können.
 
stimmt, die Tabelle enthält einen ungültigen Wert. Baue Dir ein Funktion, etwa so:

function str_to_date(datum in date) return date is
testdatum date;
begin
begin
testdatum := datum;
exception
when others then testdatum := null;
end;
return testdatum;
end;

select str_to_date(feld1), str_to_date(feld2)
from tab
where (str_to_date(datumfeld1,'yyyymmdd') - str_to_date(datumfeld2,'yyyymmdd')) <= 30;

so ist die Fehlermeldung weg und die falschen Datensätze findest du dort, wo str_to_date(feld1) oder str_to_date(feld2) null ist
 

Neue Beiträge

Zurück