kalender.Ostern.sql 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. SET QUOTED_IDENTIFIER ON
  2. GO
  3. SET ANSI_NULLS ON
  4. GO
  5. CREATE FUNCTION [kalender].[Ostern] (@Jahr AS INT)
  6. RETURNS DATE
  7. AS
  8. /*
  9. Gaußsche Osterformel (ergänzt von H. Lichtenberg)
  10. Ostern wird nach einer christlichen Tradition am ersten Sonntag nach dem ersten Vollmond des Frühjahrsanfangs auf der nördlichen Halbkugel gefeiert.
  11. Die Bestimmung des kalendarischen Datums nutzt die zyklische Natur der Erd- und Mondbewegung aus
  12. (76 Jahre = 940 Mond-Monate = 27759 Tage, Kallippischer Zyklus, benannt nach Kallippos aus Kyzikos, um 330 v. Chr.).
  13. Sie nimmt dagegen keine Rücksicht auf aktuelle astronomische Beobachtungen von Vollmond und Tag-und-Nacht-Gleichen.
  14. Zur besseren Anpassung an die tatsächlichen Umlaufzeiten von Mond und Erde werden seit der Einführung des Gregorianischen Kalenders
  15. an den Jahrhundertgrenzen gewisse Korrekturen am Kallippischen Zyklus angebracht.
  16. Carl Friedrich Gauß (1777 - 1855) hat aus den langen und schwer verständlichen Texten von Christophorus Clavius eine praktische Rechenvorschrift abgeleitet.
  17. Diese wird hier in einer von Dr. Heiner Lichtenberg, Bonn, modifizierten Form angegeben
  18. (H. Lichtenberg, Zur Interpretation der Gaußschen Osterformel und ihrer Ausnahmeregeln, Historia Mathematica 24, 441 - 444 (1997)).
  19. In dieser modernen Form lässt sie sich leicht in eine Funktion übersetzen, um das Osterdatum für jedes Jahr zu errechnen.
  20. [1] https://www.ptb.de/cms/ptb/fachabteilungen/abt4/fb-44/ag-441/darstellung-der-gesetzlichen-zeit/wann-ist-ostern.html
  21. [2] https://de.wikipedia.org/wiki/Gau%C3%9Fsche_Osterformel#Eine_erg%C3%A4nzte_Osterformel
  22. */
  23. BEGIN
  24. DECLARE @K INT, @M INT, @S INT, @A INT, @D INT, @R INT, @OG INT, @SZ INT, @OE INT
  25. DECLARE @Ostersonntag_Tag INT, @Ostersonntag_Monat INT
  26. -- 1. die Säkularzahl (Jahrhundert)
  27. SET @K = @Jahr / 100
  28. -- 2. die säkulare Mondschaltung
  29. SET @M = 15 + (3 * @K + 3) / 4 - (8 * @K + 13) / 25
  30. -- 3. die säkulare Sonnenschaltung
  31. SET @S = 2 - (3 * @K + 3) / 4
  32. -- 4. den Mondparameter
  33. SET @A = @Jahr % 19
  34. -- 5. den Keim für den ersten Vollmond im Frühling
  35. SET @D = (19 * @A + @M) % 30
  36. -- 6. die kalendarische Korrekturgröße
  37. SET @R = (@D + @A / 11) / 29
  38. -- 7. die Ostergrenze (Tag im März)
  39. SET @OG = 21 + @D - @R
  40. -- 8. den ersten Sonntag im März
  41. SET @SZ = 7 - (@Jahr + @Jahr / 4 + @S) % 7
  42. -- 9. die Entfernung des Ostersonntags von der Ostergrenze (Osterentfernung in Tagen)
  43. SET @OE = 7 - (@OG - @SZ) % 7
  44. --10. das Datum des Ostersonntags als Märzdatum (32. März = 1. April usw.)
  45. SET @Ostersonntag_Monat = 3
  46. SET @Ostersonntag_Tag = @OG + @OE
  47. --11. Falls Ostersonntag im April liegt
  48. IF @Ostersonntag_Tag > 31
  49. BEGIN
  50. SET @Ostersonntag_Monat = 4
  51. SET @Ostersonntag_Tag = @Ostersonntag_Tag - 31
  52. END
  53. RETURN DATEFROMPARTS(@Jahr, @Ostersonntag_Monat, @Ostersonntag_Tag)
  54. END
  55. GO
  56. SET QUOTED_IDENTIFIER OFF
  57. GO
  58. SET ANSI_NULLS OFF
  59. GO
  60. GO