Problem mit vorliegendem Datumsformat

sql_neuling

Benutzer
Beiträge
9
Problem mit vorliegendem Datumsformat

Hallo,

ich muss mal wieder was in SQL umsetzen und bräuchte mal eure Unterstützung.

Ich muss auch gleich eingestehen, das SQL nicht mein tägl. Brot ist - bitte ein wenig Rücksicht;)

Nun zu meinem Problem:

ich hab zwei Felder mit einem unstruckturierten Datumsformat als Number.

Hier meine Beispieldaten zu Feld1:

Feld1 -> Datum Formatieren zu

100208 -> 2010-02-08
870121 -> 1987-01-21
40225 -> 2004-02-25
..

Beispieldaten aus Feld2

Feld2 -> Datum Formatieren zu
20150101 -> 2015-01-01
20050915 -> 2005-09-15
20140801 -> 2014-08-01

Bei Feld2, hatte ich es so schonmal versucht:

select

cast(cast(table1.Feld2 as varchar(8)) as date)

from
table1;

es folgte folgende Fehlermeldung:

ORA-01847: Tag des Monats muss zwischen 1 und letztem Tag des Monats liegen
01847. 00000 - "day of month must be between 1 and last day of month"
*Cause:
*Action:

Für eure Ihlfe wäre ich euch sehr dankbar.

VG,
Sascha
 
Werbung:
Tag des Monats muss zwischen 1 und letztem Tag des Monats liegen

Dann gibt es in dem Feld eben unsinnige Daten wie z.B. ein Tag 32 oder ein Tag 31 im Monat Februar. Finde zuerst einmal mit einem SELECT heraus, welche Daten unsinnig sind und sorge für eine Richtigstellung. Noch besser wäre natürlich, wenn Du das Feld auf das richtige Datenformat umstellen (lassen) könntest.
 
100208 -> 2010-02-08
870121 -> 1987-01-21
40225 -> 2004-02-25

z.B.:
Code:
select to_char(to_date(100208,'YYMMDD'),'YYYY-MM-DD') from dual
Problematisch wird es bei der Interpretation von zweistelligen Jahreszahlen. Da gibt es Festlegungen bis wann 19 und ab wann 20 verwendet wird.
Liegen alle Angaben in der Vergangenheit? Ansonsten wird das schwierig.


Feld2 -> Datum Formatieren zu
20150101 -> 2015-01-01
20050915 -> 2005-09-15
20140801 -> 2014-08-01
Da ist es besser:
Code:
select to_char(to_date(20150101,'YYYYMMDD'),'YYYY-MM-DD') from dual
 
erstmal Danke, hab nullwerte, sowie ein Datum 19999999 gefunden, aber leider geht es immer noch nicht:(

select

case
when feld2 <> '19999999' OR feld2 <> '0' THEN
to_date(cast(cast(ERPD_OBJEKTM.OBBGOV as varchar(8)) as date),'yyyy-mm-dd') ELSE ''
END as aDate

from table1

erhalte ich nun folgende Fehlermeldung

ORA-00932: Inkonsistente Datentypen: DATE erwartet, CHAR erhalten
 
Bin nun mit meinem Datum einiges weiter, habe da aber noch ein Problem mit dem Februar:

Möchte in meiner Prozedur, wenn der Februar mehr als 28 Tage hat diese auf den Tag 28 setzen.
Hier mal meine Testprozedur, wenn hier eine eine Idee hätte wäre ich sehr Dankbar:

create or replace PROCEDURE TEST_PROC
is
l_dateYear varchar(2);
l_date varchar(9);
l_day varchar(2);
l_month varchar(2);
dateDate date;
dateNumber number := 980229;
BEGIN
if (length(dateNumber) = 6) then
l_dateYear := substr(to_char(dateNumber), 1, 2);
l_day := substr(to_char(dateNumber), 5,2);
l_month := substr(to_char(dateNumber), 3,2);
elsif (length(dateNumber) = 5) then
l_dateYear := substr('0' || to_char(dateNumber), 1, 2);
l_day := substr(to_char(dateNumber), 4,2);
l_month := substr(to_char(dateNumber), 2,2);
elsif (length(dateNumber) = 4) then
l_dateYear := substr('00' || to_char(dateNumber), 1, 2);
l_day := substr(to_char(dateNumber), 3,2);
l_month := substr(to_char(dateNumber), 1,2);
elsif (length(dateNumber) = 3) then
l_dateYear := substr('000' || to_char(dateNumber), 1, 2);
l_day := substr(to_char(dateNumber), 2,2);
l_month := substr('0' || to_char(dateNumber), 1,2);
end if;

if (to_number(l_month) >= 1 and to_number(l_month) <= 12) then
if (to_number(l_month) = 1 and to_number(l_day) BETWEEN 1 AND 31 or
to_number(l_month) = 3 and to_number(l_day) BETWEEN 1 AND 31 or
to_number(l_month) = 5 and to_number(l_day) BETWEEN 1 AND 31 or
to_number(l_month) = 7 and to_number(l_day) BETWEEN 1 AND 31 or
to_number(l_month) = 8 and to_number(l_day) BETWEEN 1 AND 31 or
to_number(l_month) = 10 and to_number(l_day) BETWEEN 1 AND 31 or
to_number(l_month) = 12 and to_number(l_day) BETWEEN 1 AND 31 or
to_number(l_month) = 4 and to_number(l_day) BETWEEN 1 AND 30 or
to_number(l_month) = 6 and to_number(l_day) BETWEEN 1 AND 30 or
to_number(l_month) = 9 and to_number(l_day) BETWEEN 1 AND 30 or
to_number(l_month) = 11 and to_number(l_day) BETWEEN 1 AND 30 or
to_number(l_month) = 2 and to_number(l_day) BETWEEN 1 AND 28) THEN

if (dateNumber >= 10000) then
if (length(l_dateYear) = 2 and length(l_month) = 2 and length(l_day) = 2) then
if (l_dateYear >= 1 and l_dateYear <= 9) then
l_date := '20' || l_dateYear || l_month || l_day;
dateDate := to_date(l_date, 'YYYYMMDD');
elsif (l_dateYear >= 10 and l_dateYear <= 70) then
l_date := '20' || l_dateYear || l_month || l_day;
dateDate := to_date(l_date, 'YYYYMMDD');
else
l_date := '19' || l_dateYear || l_month || l_day;
dateDate := to_date(l_date, 'YYYYMMDD');
end if;
end if;
elsif (dateNumber >= 100 and dateNumber < 10000) then
l_date := '2000' || l_month || l_day;
dateDate := to_date(l_date, 'YYYYMMDD');
end if;
end if;
end if;
END;
 
Werbung:
Zurück
Oben