bestimmt hat schon jemand so etwas (ähnliches) programmiert. Ostern (und diverse andere kirchliche Feiertage, ist der Abstand zu Ostern immer gleich?) hat jedes Jahr ein anderes Datum. Ich könnte eine Funktion, die das Datum in Abhängigkeit vom Jahr als Rückgabewert hat gut brauchen:
function OsterSonntag( pJahr )
local dDatum
...
return( dDatum )
Dabei würde es in meinem Fall reichen, wenn die Funktion in diesem Jahrhundert einwandfrei funktioniert. Hat jemand so etwas schon geschrieben und könnte es hier veröffentlichen oder alternativ mir per PN zur Verfügung stellen?
Keine Ahnung, wo ich diesen steinalten, aber nach wie vor funktionierenden Code herhabe. Man ruft die Funktion mit allen Tagesdaten vom Beginn bis zum Ende des Jahres auf. Feste Feiertage sind ja einfach. Ostern hat irgendwas mit den Mondphasen und so zu tun.
öhm ... wie kommst Du denn jetzt ausgerechnt auf mich?
Aber Du hast recht - ich habe genau diese Funktion. Ergänzt um diverse andere Funktionen, die einen ganzen Schwung Feiertage brechnen. Die sind ja teilweise fixe Tage, teilweise abhängig von Ostern, oder teilweise nach festen Rgeln (wie letzter Donnerstag im Oktober, was jetzt fiktiv ist).
Witzig:
Es gibt tatsächlich mehrere Versionen der Gausschen Formel. Jans Version bezieht sich auf die 2. Erweiterung, meine auf das Original. Beide kommen aber zum selben Ergebnis.
mit den beiden Erweiterungen hatte Carl Friedrich Gauß ja mehr oder weniger seltene Ausnahmen mit eingebaut. Ob die wirklich jeder braucht sei mal dahin gestellt. Aber ich brauche die unbedingt.
function OsterSonntag( nJahr: integer ): TDate;
var k1,k2,k3,k4,nTag,nMonat: integer;
var dOsterSonntag: TDate;
begin
k1 := (nJahr div 100) - (nJahr div 400) + 4;
k2 := k1 - (nJahr div 300) + 11;
k3 := (( nJahr mod 19 ) * 19 + k2) mod 30;
k4 := (( (nJahr mod 4) * 2 + (4*nJahr) + (6*k3) + k1 ) mod 7) + k3 - 9;
if k4<1 then begin
nTag := 31 + k4;
nMonat := 3;
end else begin
if (k4=26) or ((k3=28) and (k4=25) and ((11 * (k2+1 mod 30)) < 19)) then begin
k4 := k4 - 7;
end;
nTag := k4;
nMonat := 4;
end;
dOsterSonntag := EncodeDate( nJahr,nMonat,nTag );
Result := dOsterSonntag;
end;
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
CREATE FUNCTION jde.Ostersonntag(jahr INTEGER) RETURNS Date
BEGIN
DECLARE a INTEGER, b INTEGER, c INTEGER, d INTEGER, e INTEGER, f INTEGER;
DECLARE ts TIMESTAMP;
a = Mod(jahr,19);
b = Jahr/100;
c = (8*b+13)/25-2;
d = b-(Jahr/400)-2;
e = MOD(19*a+MOD(15-c+d,30),30);
IF e=28 THEN
IF a>10 THEN
e=27;
END;
ELSEIF e=29 THEN
e=28;
END;
f = MOD(d+6*e+2*MOD(jahr,4)+4*MOD(jahr,7)+6,7);
ts = CREATETIMESTAMP(jahr,3,1,0,0,0,0);
ts = TIMESTAMPADD(SQL_TSI_DAY,e+f+21,ts);
RETURN CAST(ts AS SQL_DATE);
END;