Anmelden

View Full Version : Datum in SQL Funktion prüfen



malzusrex
06-11-14, 14:06
Hallo Gemeinde!

Wie kann ich denn am besten/einfachsten Fehler in einer SQL-Funtion abfangen?
Habe mir eine Funktion gebastelt, die aus 2 Numerichen 8selligen Felder (welche je mit einem gültigen Datum gefüllt sein sollten) die Differenz in Tagen aus gibt.
Steht nun aber in einem Feld 20140931 fällt die Funtion auf die Nase.
Ich würde nun gern in diesem Fall das die Funktion 0 oder 999999 zurück gibt.



Create Function MyLib/DAT_Diff( Dat1 Dec(8, 0), Dat2 Dec(8, 0) )
Returns Decimal (6, 0)
Language sql
Return
Days(Date(SubStr(Digits(Dat1), 1, 4) Concat '-' Concat
SubStr(Digits(Dat1), 5, 2) Concat '-' Concat
SubStr(Digits(Dat1), 7, 2) ))
-Days(Date(SubStr(Digits(Dat2), 1, 4) Concat '-' Concat
SubStr(Digits(Dat2), 5, 2) Concat '-' Concat
SubStr(Digits(Dat2), 7, 2) ))


Gruß
Ronald

dabeda
06-11-14, 14:23
Meines Wissens geht das mit

declare EXIT HANDLER FOR SQLEXCEPTION return 0;

malzusrex
06-11-14, 14:33
Danke!

Das war es



Create Function MyLib/DAT_Diff( Dat1 Dec(8, 0), Dat2 Dec(8, 0) )
Returns Decimal (6, 0)
Language sql
Begin
declare EXIT HANDLER FOR SQLEXCEPTION return 0;
Return
Days(Date(SubStr(Digits(Dat1), 1, 4) Concat '-' Concat
SubStr(Digits(Dat1), 5, 2) Concat '-' Concat
SubStr(Digits(Dat1), 7, 2) ))
-Days(Date(SubStr(Digits(Dat2), 1, 4) Concat '-' Concat
SubStr(Digits(Dat2), 5, 2) Concat '-' Concat
SubStr(Digits(Dat2), 7, 2) ));
end

Fuerchau
06-11-14, 16:38
Das geht auch einfacher:

days(date(char(Dat1 * 1000000))) - days(date(char(Dat2 * 1000000)))

Die Funktion Date erlaubt auch einen Timestamp in der Form JJJJMMTTHHMMSS:p.

malzusrex
07-11-14, 07:17
Gut werde ich umbauen.

(aber das Beispiel hatte ich auch mal von dir ;-) )
http://newsolutions.de/forum-systemi-as400-i5-iseries/threads/16593-SQL-Datumsdifferenz-in-Tagen

Fuerchau
07-11-14, 07:53
Man lernt nie aus und SQL wird von Release zu Release besser. Das ISO-Datum galt noch für V4!

Fuerchau
07-11-14, 08:01
Nachtrag:
Ich habe mir mal eine VBA-ähnliche Funktion gebaut:
DATESERIAL(Year as integer, Month as Integer, Day as integer) as Date
return date('0001-01-01') + (year - 1) Years + (Month - 1) months + (day - 1) days;
Fehlerabfangen falls Über-/Unterlauf.

Diese ist zum Rechnen manchmal ganz gut.
Beispiel:
Dateserial(Year(mydate), Month(Mydate) + 1, 0) = immer der Letzte des Monats
Ich denke da gibt es immer wieder Anwendungen, auch z.B. bei alten Strukturen mit getrennten Datumfeldern.

Ggf. kann man ja noch einen "case when Year < 100 then case when Year < 40 then year + 2000 else year + 1900 end else year end" einbauen um 2-stellige Jahre zu berücksichtigen (wie Microsoft auch).