SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
CREATE FUNCTION [kalender].[Ostern] (@Jahr AS INT)
RETURNS DATE
AS 
/*
Gaußsche Osterformel (ergänzt von H. Lichtenberg)

Ostern wird nach einer christlichen Tradition am ersten Sonntag nach dem ersten Vollmond des Frühjahrsanfangs auf der nördlichen Halbkugel gefeiert. 
Die Bestimmung des kalendarischen Datums nutzt die zyklische Natur der Erd- und Mondbewegung aus 
(76 Jahre = 940 Mond-Monate = 27759 Tage, Kallippischer Zyklus, benannt nach Kallippos aus Kyzikos, um 330 v. Chr.). 
Sie nimmt dagegen keine Rücksicht auf aktuelle astronomische Beobachtungen von Vollmond und Tag-und-Nacht-Gleichen. 

Zur besseren Anpassung an die tatsächlichen Umlaufzeiten von Mond und Erde werden seit der Einführung des Gregorianischen Kalenders 
an den Jahrhundertgrenzen gewisse Korrekturen am Kallippischen Zyklus angebracht. 
Carl Friedrich Gauß (1777 - 1855) hat aus den langen und schwer verständlichen Texten von Christophorus Clavius eine praktische Rechenvorschrift abgeleitet. 
Diese wird hier in einer von Dr. Heiner Lichtenberg, Bonn, modifizierten Form angegeben 
(H. Lichtenberg, Zur Interpretation der Gaußschen Osterformel und ihrer Ausnahmeregeln, Historia Mathematica 24, 441 - 444 (1997)). 

In dieser modernen Form lässt sie sich leicht in eine Funktion übersetzen, um das Osterdatum für jedes Jahr zu errechnen.

[1] https://www.ptb.de/cms/ptb/fachabteilungen/abt4/fb-44/ag-441/darstellung-der-gesetzlichen-zeit/wann-ist-ostern.html
[2] https://de.wikipedia.org/wiki/Gau%C3%9Fsche_Osterformel#Eine_erg%C3%A4nzte_Osterformel

*/

BEGIN
  DECLARE @K INT, @M INT, @S INT, @A INT, @D INT, @R INT, @OG INT, @SZ INT, @OE INT
  DECLARE @Ostersonntag_Tag INT, @Ostersonntag_Monat INT

  -- 1. die Säkularzahl	(Jahrhundert)
  SET @K = @Jahr / 100

  -- 2. die säkulare Mondschaltung	
  SET @M = 15 + (3 * @K + 3) / 4 - (8 * @K + 13) / 25

  -- 3.	die säkulare Sonnenschaltung	
  SET @S = 2 - (3 * @K + 3) / 4
  
  -- 4. den Mondparameter	
  SET @A = @Jahr % 19

  -- 5. den Keim für den ersten Vollmond im Frühling	
  SET @D = (19 * @A + @M) % 30

  -- 6. die kalendarische Korrekturgröße	
  SET @R = (@D + @A / 11) / 29

  -- 7. die Ostergrenze	(Tag im März)
  SET @OG = 21 + @D - @R

  -- 8. den ersten Sonntag im März	
  SET @SZ = 7 - (@Jahr + @Jahr / 4 + @S) % 7

  -- 9. die Entfernung des Ostersonntags von der Ostergrenze (Osterentfernung in Tagen)	
  SET @OE = 7 - (@OG - @SZ) % 7

  --10. das Datum des Ostersonntags	als Märzdatum (32. März = 1. April usw.)
  SET @Ostersonntag_Monat = 3
  SET @Ostersonntag_Tag = @OG + @OE

  --11. Falls Ostersonntag im April liegt
  IF @Ostersonntag_Tag > 31
    BEGIN 
      SET @Ostersonntag_Monat = 4
      SET @Ostersonntag_Tag = @Ostersonntag_Tag - 31
	END
   
  RETURN DATEFROMPARTS(@Jahr, @Ostersonntag_Monat, @Ostersonntag_Tag)
END
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

GO
