Monday, April 04, 2011

הלוח העברי בעזרת TSQL (2)

לפני כשנה מאיר דודאי ציטט קוד לפונקציה שמחשבת את התאריך של פסח, וגם שאל בקריצה אם טרם יצרתי פונקציה כזו בעצמי. למען האמת יש לי סקריפט פשוט שמחשב את התאריך המדוייק של פסח מיציאת מצרים ועד לביאת המשיח:

clip_image002_thumb_1DE09F74.jpg

וברצינות- הפונקציה הנ"ל (ניתן למצוא אותה כאן בצירוף פונקציות נוספות) מתבססת על נוסחה שפיתח גאוס - מתמטיקאי גרמני שהיה אולי גדול המתמטיקאים מאז ומעולם, ואם לא- אז בוודאי בחמישיה הפותחת; ואשר נועדה במקורה לחשב את מועדו של ה-Easter - חג הפסחא הנוצרי שמועדו מתבסס על הירח ומשמר במידת מה את מקורו היהודי וחל ביום ראשון שלאחר מילוא הירח שלאחר יום השיוויון (כלומר- גם חג האביב וגם מתייחס לאמצע החודש העברי), ובשינויים מסויימים הוא הותאם לחישוב חג הפסח היהודי.

מי שרוצה לעקוב אחר שיטת החישוב של גאוס יכול להציץ כאן, ומי שרוצה בעברית-
בעזרת הפונקציה הנ"ל ניתן לחשב די בקלות את הלוח העברי מבלי להסתבך עם מועדי המולד, הדחיות, העיבורים וכו': מוצאים את מועדי חג הפסח, 163 יום לאחר פסח חל ראש השנה, ולפי ההפרש בין ראש שנה אחד לזה שאחריו אפשר לראות אם השנה מעוברת או פשוטה, אם חשוון מלא או לא, ואם כסלו חסר או לא. 
דבר ראשון- ניצור את הפונקציה לחישוב פסח:

CREATE function dbo.Passover(@Yr int)
returns datetime
AS
BEGIN
   Declare @HYear int, @Matonic int, @LeapException int, @Leap int, @DOW int, @Century int
   Declare @fDay float(20), @fFracDay float(20)
   Declare @Mo int, @Day int
   Set @HYear=@Yr+3760
   Set @Matonic=(12*@HYear+17) % 19
   Set @Leap=@HYear % 4
   Set @fDay=32+4343/98496.+@Matonic+@Matonic*(272953/492480.)+@Leap/4.
   Set @fDay=@fDay-@HYear*(313/98496.)
   Set @fFracDay=@fDay-FLOOR(@fDay)
   Set @DOW=cast (3*@HYear+5*@Leap+FLOOR(@fDay)+5 as int) % 7
   IF @DOW=2 or @DOW=4 or @DOW=6
      set @fDay=@fDay+1
   IF @DOW=1 and @Matonic>6 and @fFracDay>=1367/2160.
      set @fDay=@fDay+2
   IF @DOW=0 and @Matonic>11 and @fFracDay>=23269/25920.
      set @fDay=@fDay+1
   Set @Century=FLOOR(@Yr/100.)
   Set @LeapException=FLOOR((3*@Century-5)/4.)
   IF @Yr>1582
      set @fDay=@fDay+@LeapException
   Set @Day=FLOOR(@fDay)

Read more: גרי רשף