create or replace function f_kna_vergl_dat(id_gueltig_ab date) return date is /* ************************************************************************************************************** * Funktion: * f_kna_monat_vorjahr(id_gueltig_ab) * Autor: * Heiko Hommes * Erstell-Datum: * 16.04.2002 * Beschreibung: * Funktion gibt ein statistisch gleichwertiges Datum für das Vorjahr zurück. * z.B: 9.3.2002 ist ein der 2. Samstag im März * das zugehörige Datum des Vorjahrs ist der 10.3.2001 ebenfalss der 2. Samstag im März * Modifiziert: ************************************************************************************************************** */ /* D E C L A R E */ vn_wonr number := 0; /* Wochentagesnummer aktuelles Jahr */ vn_vwonr number := 0; /* Wochentagesnummer Vorjahr */ vn_tagnr number :=0; /* n-te Wochentag im Monat */ vd_vdat date; /* vergleichbares Vorjahresdatum */ vn_tagdiff number := 0; /* Differenz Zwischen Wochentagesnummer akt_ Jahr zu Wochentagesnummer V.Jahr*/ ve_fehler exception; /* Fehler bei ungültigen Werten */ va_fehlertxt varchar2(255); /*Fehlermeldung*/ begin /* Zuweisung Wochentagsnummer aktuelles Jahr*/ vn_wonr := to_char(id_gueltig_ab,'D'); /* Zuweisung n-ter Wochentag Wochentagim Monat*/ /* ceil(n) gibt die aufgerundete Ganzzahl zurück */ vn_tagnr := ceil(to_char(id_gueltig_ab,'DD')/7); /* Bestimmung erste des Vorjahres*/ vd_vdat := '01.' || to_char(id_gueltig_ab,'MM.') || (to_char(id_gueltig_ab,'YYYY') -1); /* Zuweisung Wochentagsnummer Vorjahr*/ vn_vwonr := to_char(vd_vdat,'D'); vn_tagdiff := vn_wonr - vn_vwonr; /*Ist die Wochentagsdifferenz negativ, dann lässt es darauf schliessen, das der vergleichbare Wochentag im Vormonat liegt. Dieser muss allerdings im aktuellen Monat liegen und somit + 7 Tage */ if vn_tagdiff < 0 then vn_tagdiff := vn_tagdiff +7; end if; /*Zuweisung vergleichbares Vorjahresdatum */ vd_vdat := vd_vdat + vn_tagdiff + (vn_tagnr - 1)* 7; /* Fehler bei ungültigen Werten */ /* vn_tagnr muss zwischen 1 und 5 liegen */ if vn_tagnr not between 1 and 5 then RAISE ve_fehler; end if; /* vn_wonr muss zwischen 1 und 7 liegen */ if vn_wonr not between 1 and 7 then RAISE ve_fehler; end if; /* vn_vwonr muss zwischen 1 und 7 liegen */ if vn_vwonr not between 1 and 7 then RAISE ve_fehler; end if; return vd_vdat; EXCEPTION -- Fehler WHEN OTHERS THEN va_fehlertxt := 'Pl/SQL Fehler: '||SQLCODE||' '||SUBSTR(SQLERRM,1,200); DBMS_OUTPUT.PUT_LINE(va_fehlertxt); DBMS_OUTPUT.PUT_LINE('vn_wonr: ' || vn_wonr || ' vn_vwonr: ' || vn_vwonr || ' vn_tagnr: ' || vn_tagnr || ' vd_vdat: ' || to_char(vd_vdat,'DD.MM.YYYY') || ' vn_tagdiff: ' || vn_tagdiff || ' id_gueltig_ab: ' || to_char(id_gueltig_ab,'DD.MM.YYYY') ); DBMS_OUTPUT.PUT_LINE('f_kna_monat_vorjahr FEHLER am '||to_char(sysdate,'dd.mm.yyyy hh24:mi:ss')); end f_kna_vergl_dat;