הבלוג של גרי רשף

29/03/2011

הלוח העברי בעזרת TSQL

Filed under: Uncategorized — תגיות: , — גרי רשף @ 22:22

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

תחילתה של הספירה לפי המסורת הוא ביום שישי בו נברא האדם – על פי המסופר בבראשית פרק א', בשעה 08:00 בבוקר (שעה 14 לפי המניין העברי המונה את השעות לא מחצות הלילה אלא משעה 18:00 ביום הקודם). בנקודה זמן זו היה מולד הירח.
אם מחשבים שנה קודם לכן – 12 חודשי ירח לאחור מבריאת האדם – מגיעים לנקודת זמן תיאורטית ביום שני 6 בספטמבר שנת 3761 לפני הספירה בשעה 23:11 (שעה 5 ו-204 חלקים על פי המניין העברי בו כל שעה מתחלקת ל-1080 חלקים); ונקודת זמן זו נקראת מולד תוהו (כלומר- מולד תיאורטי של הירח הרבה זמן לפני שהוא נברא ביום הרביעי..), וביחס אליה מחשבים את המולדים העתידיים של הירח. מדוע מחשבים את המולדים ביחס למולד תוהו ולא ביחס לבריאת האדם הראשון- אינני יודע.

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

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

כמה זמן נמשך חודש עברי (חודש ירחי) בממוצע? לפי המסורת שהתגבשה לפני כאלפיים שנה כשכבר היה ידע אסטרונומי מדוייק יחסית- 29 ימים, 12 שעות, ו-793 חלקי שעה (מתוך 1080 כאמור), שזה סוטה סטייה זניחה ממדידות מדוייקות בנות ימינו (פחות מחצי שניה).

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

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

מכיוון שחודש צריך להיות נקוב בימים שלמים (לא ניתן לעבור חודש באמצע היום..) ומכיוון שחודש ירחי נמשך 29.5 ימים בקירוב, החודשים העבריים הם באורך של 30 יום ו-29 יום לסירוגין (תשרי – 30, חשוון – 29,.., אב – 30 ,אלול – 29); למעט תיקונים קטנים כפי שיוסבר בהמשך.
12 חודשים עבריים נמשכים איפוא 354 יום, בשעה ששנה שמשית לועזית נמשכת 365.25 יום בערך; וזה מצריך מנגנון התאמה של השנה הירחית לשמשית (בניגוד לשנה המוסלמית בה לא קיים מנגנון כזה ולכן היא זזה לאחור ומשלימה סיבוב כל 32 שנים פחות או יותר), ולכן 7 פעמים בכל מחזור של 19 שנה מתווסף חודש אדר א' ובו 30 יום (ב-19 שנה הסטייה השנתית של 11.25 יום מצטברת ל-214 ימים בערך, ואם מחלקים ב-7 מקבלים 30 ימים בקירוב). השנים המעוברות הן השנים בהן השארית מחלוקה ב-19 היא 3,6,8,11,14,17,19 (19=0 כמובן), ומקובל לציין זאת בראשי תיבות- גו"ח אדז"ט.

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

כדאי להדגיש שהחודש הנוסף הוא אדר א' ולא אדר ב' שכן יש בו 30 יום (באדר רגיל ובאדר ב' יש 29 יום), ולכן את פורים חוגגים באדר ב'.

זה הכל? לא- יש עוד מנגנון התאמה שנועד לתיקונים קטנים: את השנה העברית שנמשכת 354 יום או 384 יום (בשנה מעוברת) ניתן להאריך ביום או לקצר ביום. אם רוצים להאריך ביום- מאריכים את חודש חשוון מ-29 ל-30 יום, ואם רוצים לקצר ביום- מקצרים את כסלו מ-30 יום ל-29 יום (וברור שאם מאריכים את חשוון לא משנים את כסלו, ואם מקצרים את כסלו לא משנים את חשוון).
כאשר קורה אחד או יותר מהתנאים הבאים ראש השנה נדחה ביום:
1. מולד זקן- אם המולד התרחש לאחר שעה 12:00 בצהריים (שעה 18 לפי מניין השעות העברי).

2. גטר"ד- אם המולד התרחש ביום שלישי בשנה לא מעוברת לאחר השעה 3:11 (9 שעות ו-204 חלקים לפי המניין העברי)

3. בטותקפ"ט- אם המולד התרחש ביום שני בשנה לאחר שנה מעוברת לאחר השעה 9:33 (15 שעות ו-589 חלקים)

הסיבה לתנאים המשונים הללו היא גם להתגבר על ההפרשים הקטנים שנותרו לאחר עיבור השנים, וגם כדי למנוע מצב בו אורך השנה חורג ביותר מיום אחד מ-354 (או 384 בשנה מעוברת).
לא אד"ו ראש- אם לאחר התיקון הנ"ל ראש השנה חל ביום ראשון או רביעי או שישי – הוא נדחה ביום, וזה נועד בעיקר למנוע מיום כיפור לחול בסמוך לשבת ומהושענא רבא לחול בשבת. יש מי שמכירים את הכלל הסימטרי – לא בד"ו פסח: אם פסח חל ביום ב' / ד' / ו', ראש השנה אחריו יחול ביום ד' / ו' / א' בהתאמה.

לפני שניגש לקוד- בעייה טכנית "פעוטה": משתני התאריך של SQL Server אינם תומכים בתאריכים לפני הספירה: חלקם תומכים בתאריכים החל משנה 1 לספירה (וגם אלו – מגרסת 2008 ואילך) וחלקם בתאריכים משנת 1753 ואילך. לפיכך לא נוכל לחשב בעזרתם את הלוח העברי מתחילתו, ונאלץ להתחיל בנקודת זמן מאוחרת יותר; למשל משנת 1900 ה'תרס"א (5661). ראש השנה חל באותה שנה ביום שני 24/09/1900, אבל אנחנו זקוקים לנקודת הזמן המדוייקת של המולד המחושב. ברגע שתהיה לנו נקודה כזו- נוכל לחשב בעזרתה את המולד בשנים העוקבות וכן את מועדי ראש השנה.

שיטה מקובלת לעשות זאת היא לחשב כמה זמן עבר ממולד תוהו (ימים, שעות, וחלקי שעה),
ולפי השארית מחלוקה ב-7 נדע באיזה יום בשבוע חל המולד המחושב, וכן את השעה וחלקי השעה.
לאחר מכן צריך למצוא את השבוע בו ציינו את ראש השנה או שבו חל המולד לפי הלוחות האסטרונומיים, ובו למקם את היום והזמן שחישבנו. יש כאן תחמון מסויים מכיוון שנעזרים בחישובים של אחרים, ואולי בהזדמנות אנסה להעמיד חישוב מלא ובלתי תלוי.
בכל מקרה- אורכו של חודש עברי הוא 29 יום, 12 שעות ו-793 חלקים, ובסה"כ (בחלקי שעה עבריים):

29*24*1080+12*1080+793=765,433

מולד תוהו חל ביום שני בשעה 5 (עברית) ו-204 חלקים שזה סה"כ בחלקים:

2*24*1080+5*1080+204=57,444

5661 שנים כוללים 297 מחזורים של 19 שנה ועוד 17 שנה במחזור האחרון.
297 מחזורים של 19 שנה (בכל מחזור 235 חודשים = 12*19+7) שזה בחלקים:

297*235*765,433=53,423,396,235

וב-17 השנה של המחזור הנוכחי (מתוכן 6 שנים מעוברות) היו בחלקים:

(17*12+6)*765,433=160,740,930

ובסה"כ בחלקים:

57,444+53,423,396,235+160,740,930=53,584,194,609

נחלק ב-1080 ונקבל 49,614,995 ושארית 9.
נחלק ב-24 ונקבל 2,067,291 ושארית 11.
נחלק ב-7 ונקבל 295,327 ושארית 2.
בסה"כ קיבלנו שהמולד של שנת ה'תרס"א חל ביום שני, בשעה 11 ו-9 חלקים למניין העברי, שזה 05:00:03 לפנות בוקר.
ראש השנה באותה שנה חל ביום שני 24/09/1900 ולכן המולד חל בתאריך זה.

חישוב בדרך מעט שונה- בדעת ובוויקיפדיה.
הערות מתודיות- מולד תוהו חל למיטב הבנתי ביום אחד + 5 שעות + 204 חלקים (ולא שני ימים), אבל מכיוון שכך נהוג משום מה לחשב במקורות עליהם הסתמכתי, ומכיוון שזה ממילא מתקזז בחישוב של היום בשבוע בו חל המולד- אני משאיר את זה כך.
בנוסף- למיטב הבנתי השנה ההיפותטית ממולד תוהו ועד בריאת האדם הייתה אמורה להיות שנה מעוברת, ואינני יודע אם יש לזה תירוץ מתאים..
ואחרונה- שנת 5661 מתחילה 5660 שנה מתחילת הספירה (בריאת האדם) ומסתיימת ב-5661 לספירה; וכך השנה הראשונה לספירה היא שנה 1 (א'), והשנה שלפניה היא שנה 1 לפני הספירה: אין שנת אפס (0) לספירה! יחד עם זאת- החישוב הוא ממולד תוהו ולכן השנה מתחילה בכל זאת 5661 ממנו..

נו טוב, ומה עם קצת SQL? נתחיל עם חישוב ראשי השנה:

Declare    @Molad DateTime,

        @Shana Int,

        @Shanim Int,

        @Hodesh Decimal(20,10);

Select    @Molad='19000924 05:00:30',

        @Shana=5661,

        @Shanim=200,

        @Hodesh=29+12./24+793./1080./24;


With Shanim As

(Select    Shana,

        Meuberet,

        Molad,

        Yom,

        MeuberetKodemet,

        Cast(Null As DateTime) RoshHashanaHakodemet,

        Dhia1,

        Dhia2,

        Dhia3,

        Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End Dhia4,

        RoshHashana+Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End RoshHashana

From    (Select    *,

                Cast(DateDiff(Day,0,Molad) As DateTime)+Case When 1 In (Dhia1,Dhia2,Dhia3) Then 1 Else 0 End RoshHashana

        From    (Select    *,

                        Case When Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(12./24) Then 1 Else 0 End Dhia1,--מולד זקן

                        Case When Yom=3 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(3.+204./1080)/24 And Meuberet=0 Then 1 Else 0 End Dhia2,--ג' ט' ר"ד בשנה פשוטה

                        Case When Yom=2 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(9.+589./1080)/24 And MeuberetKodemet=1 Then 1 Else 0 End Dhia3 --ב' ט"ו תקפ"ט בפשוטה שאחרי מעוברת

                From    (Select    @Shana Shana,

                                Case When @Shana%19 In (3,6,8,11,14,17,0) Then 1

                                    Else 0

                                    End Meuberet,

                                @Molad Molad,

                                DatePart(Weekday,@Molad) Yom,

                                Case When (@Shana-1)%19 In (3,6,8,11,14,17,0) Then 1

                                    Else 0

                                    End MeuberetKodemet) T) T) T

Union All

Select    Shana,

        Meuberet,

        Molad,

        Yom,

        MeuberetKodemet,

        RoshHashanaHakodemet,

        Dhia1,

        Dhia2,

        Dhia3,

        Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End Dhia4,--לא אדו ראש

        RoshHashana+Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End RoshHashana

From    (Select    *,

                Cast(DateDiff(Day,0,Molad) As DateTime)+Case When 1 In (Dhia1,Dhia2,Dhia3) Then 1 Else 0 End RoshHashana

        From    (Select    *,

                        Case When Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(12./24) Then 1 Else 0 End Dhia1,--מולד זקן

                        Case When Yom=3 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(3.+204./1080)/24 And Meuberet=0 Then 1 Else 0 End Dhia2,--ג' ט' ר"ד בשנה פשוטה

                        Case When Yom=2 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(9.+589./1080)/24 And MeuberetKodemet=1 Then 1 Else 0 End Dhia3 --ב' ט"ו תקפ"ט בפשוטה שאחרי מעוברת

                From    (Select    *,

                                Case When Shana%19 In (3,6,8,11,14,17,0) Then 1

                                    Else 0

                                    End Meuberet,

                                DatePart(Weekday,Molad) Yom

                        From    (Select    Shana+1 Shana,

                                        Molad+Cast(12+Meuberet As Decimal(20,10))*@Hodesh Molad,

                                        Meuberet MeuberetKodemet,

                                        RoshHashana RoshHashanaHakodemet

                                From    Shanim) T

                        Where    Shana<@Shana+@Shanim) T) T) T)

Select    Shana,

        Meuberet,

        Molad,

        Yom,

        MeuberetKodemet,

        RoshHashanaHakodemet,

        Dhia1,--מולד זקן

        Dhia2,--ג' ט' ר"ד בשנה פשוטה

        Dhia3, --ב' ט"ו תקפ"ט בפשוטה שאחרי מעוברת

        Dhia4,--לא אדו ראש

        RoshHashanaHabaa,

        DateDiff(Day,RoshHashanaHakodemet,RoshHashana) Yamim

From    Shanim

Option (MaxRecursion 0);

Go

clip_image002

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

בכל שלב אני מוסיף 12 או 13 חודשים – תלוי אם השנה מעוברת (אורכו של החודש מוגדר כקבוע בהתחלה).

אני "שומר" את תאריך ראש השנה הקודמת ואת אינדיקציית העיבור כדי לחשב את אורכה (לצורך חישוב אורכם של חשוון וכסלו) ואת הדחייה של ראש השנה.

נוסיף כעת את החישוב של החודשים בכל שנה:

Declare    @Molad DateTime,

        @Shana Int,

        @Shanim Int,

        @Hodesh Decimal(20,10);

Select    @Molad='19000924 05:00:30',

        @Shana=5661,

        @Shanim=200,

        @Hodesh=29+12./24+793./1080./24;


With Hodashim As

(Select 1 ID, 'תשרי' Hodesh,30 Yamim, Null Sug Union All

Select 2 ID, 'חשוון' Hodesh,29 Yamim, Null Sug Union All

Select 2 ID, 'חשוון' Hodesh,30 Yamim, 'מלא' Sug Union All

Select 3 ID, 'כסלו' Hodesh,30 Yamim, Null Sug Union All

Select 3 ID, 'כסלו' Hodesh,29 Yamim, 'חסר' Sug Union All

Select 4 ID, 'טבת' Hodesh,29 Yamim, Null Sug Union All

Select 5 ID, 'שבט' Hodesh,30 Yamim, Null Sug Union All

Select 6 ID, 'אדר' Hodesh,29 Yamim, Null Sug Union All

Select 6 ID, 'אדר א' Hodesh,30 Yamim, Null Sug Union All

Select 6 ID, 'אדר ב' Hodesh,29 Yamim, Null Sug Union All

Select 7 ID, 'ניסן' Hodesh,30 Yamim, Null Sug Union All

Select 8 ID, 'אייר' Hodesh,29 Yamim, Null Sug Union All

Select 9 ID, 'סיוון' Hodesh,30 Yamim, Null Sug Union All

Select 10 ID, 'תמוז' Hodesh,29 Yamim, Null Sug Union All

Select 11 ID, 'אב' Hodesh,30 Yamim, Null Sug Union All

Select 12 ID, 'אלול' Hodesh,29 Yamim, Null Sug),

Shanim As

(Select    Shana,

        Meuberet,

        Molad,

        Yom,

        MeuberetKodemet,

        Cast(Null As DateTime) RoshHashanaHakodemet,

        Dhia1,

        Dhia2,

        Dhia3,

        Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End Dhia4,

        RoshHashana+Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End RoshHashana

From    (Select    *,

                Cast(DateDiff(Day,0,Molad) As DateTime)+Case When 1 In (Dhia1,Dhia2,Dhia3) Then 1 Else 0 End RoshHashana

        From    (Select    *,

                        Case When Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(12./24) Then 1 Else 0 End Dhia1,--מולד זקן

                        Case When Yom=3 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(3.+204./1080)/24 And Meuberet=0 Then 1 Else 0 End Dhia2,--ג' ט' ר"ד בשנה פשוטה

                        Case When Yom=2 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(9.+589./1080)/24 And MeuberetKodemet=1 Then 1 Else 0 End Dhia3 --ב' ט"ו תקפ"ט בפשוטה שאחרי מעוברת

                From    (Select    @Shana Shana,

                                Case When @Shana%19 In (3,6,8,11,14,17,0) Then 1

                                    Else 0

                                    End Meuberet,

                                @Molad Molad,

                                DatePart(Weekday,@Molad) Yom,

                                Case When (@Shana-1)%19 In (3,6,8,11,14,17,0) Then 1

                                    Else 0

                                    End MeuberetKodemet) T) T) T

Union All

Select    Shana,

        Meuberet,

        Molad,

        Yom,

        MeuberetKodemet,

        RoshHashanaHakodemet,

        Dhia1,

        Dhia2,

        Dhia3,

        Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End Dhia4,

        RoshHashana+Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End RoshHashana

From    (Select    *,

                Cast(DateDiff(Day,0,Molad) As DateTime)+Case When 1 In (Dhia1,Dhia2,Dhia3) Then 1 Else 0 End RoshHashana

        From    (Select    *,

                        Case When Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(12./24) Then 1 Else 0 End Dhia1,--מולד זקן

                        Case When Yom=3 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(3.+204./1080)/24 And Meuberet=0 Then 1 Else 0 End Dhia2,--ג' ט' ר"ד בשנה פשוטה

                        Case When Yom=2 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(9.+589./1080)/24 And MeuberetKodemet=1 Then 1 Else 0 End Dhia3 --ב' ט"ו תקפ"ט בפשוטה שאחרי מעוברת

                From    (Select    *,

                                Case When Shana%19 In (3,6,8,11,14,17,0) Then 1

                                    Else 0

                                    End Meuberet,

                                DatePart(Weekday,Molad) Yom

                        From    (Select    Shana+1 Shana,

                                        Molad+Cast(12+Meuberet As Decimal(20,10))*@Hodesh Molad,

                                        Meuberet MeuberetKodemet,

                                        RoshHashana RoshHashanaHakodemet

                                From    Shanim) T

                        Where    Shana<@Shana+@Shanim) T) T) T)

Select    S.Shana-1 Shana,

        S.Meuberet,

        S.Molad,

        S.Yom,

        S.MeuberetKodemet,

        S.RoshHashanaHakodemet,

        S.Dhia1,--מולד זקן

        S.Dhia2,--ג' ט' ר"ד בשנה פשוטה

        S.Dhia3, --ב' ט"ו תקפ"ט בפשוטה שאחרי מעוברת

        S.Dhia4,--לא אדו ראש

        S.RoshHashana RoshHashanaHabaa,

        DateDiff(Day,S.RoshHashanaHakodemet,S.RoshHashana) Yamim,

        H.Hodesh,

        H.Yamim YamimBehodesh,

        H.Sug SugHodesh

From    Shanim S

Inner Join Hodashim H

        On ((S.MeuberetKodemet=0 And H.Hodesh Not In ('אדר א','אדר ב'))

                Or (S.MeuberetKodemet=1 And H.Hodesh Not In ('אדר')))

            And ((DateDiff(Day,S.RoshHashanaHakodemet,S.RoshHashana)%10=3

                    And (H.Hodesh<>'חשוון' Or H.Sug Is Null)

                    And (H.Hodesh<>'כסלו' Or H.Sug='חסר'))

                Or (DateDiff(Day,S.RoshHashanaHakodemet,S.RoshHashana)%10=4

                    And H.Sug Is Null)

                Or (DateDiff(Day,S.RoshHashanaHakodemet,S.RoshHashana)%10=5

                    And (H.Hodesh<>'חשוון' Or H.Sug='מלא')

                    And (H.Hodesh<>'כסלו' Or H.Sug Is Null)))

Where    S.RoshHashanaHakodemet Is Not Null

Option (MaxRecursion 0);

Go

clip_image004

ציינתי את שמות החודשים, בחרתי בין אדר לבין אדר א' & אדר ב', וכן חישבתי אם חשוון מלא או אם כסלו חסר.

לבסוף החישוב המלא הכולל את כל הימים בכל חודש, אבל רק עם העמודות החשובות:

Declare    @Molad DateTime,

        @Shana Int,

        @Shanim Int,

        @Hodesh Decimal(20,10);

Select    @Molad='19000924 05:00:30',

        @Shana=5661,

        @Shanim=200,

        @Hodesh=29+12./24+793./1080./24;


With Yamim As

(Select 1 Yom

Union All

Select    Yom+1

From    Yamim

Where    Yom<30),

Hodashim As

(Select 1 ID, 'תשרי' Hodesh,30 Yamim, Null Sug Union All

Select 2 ID, 'חשוון' Hodesh,29 Yamim, Null Sug Union All

Select 2 ID, 'חשוון' Hodesh,30 Yamim, 'מלא' Sug Union All

Select 3 ID, 'כסלו' Hodesh,30 Yamim, Null Sug Union All

Select 3 ID, 'כסלו' Hodesh,29 Yamim, 'חסר' Sug Union All

Select 4 ID, 'טבת' Hodesh,29 Yamim, Null Sug Union All

Select 5 ID, 'שבט' Hodesh,30 Yamim, Null Sug Union All

Select 6 ID, 'אדר' Hodesh,29 Yamim, Null Sug Union All

Select 6 ID, 'אדר א' Hodesh,30 Yamim, Null Sug Union All

Select 6 ID, 'אדר ב' Hodesh,29 Yamim, Null Sug Union All

Select 7 ID, 'ניסן' Hodesh,30 Yamim, Null Sug Union All

Select 8 ID, 'אייר' Hodesh,29 Yamim, Null Sug Union All

Select 9 ID, 'סיוון' Hodesh,30 Yamim, Null Sug Union All

Select 10 ID, 'תמוז' Hodesh,29 Yamim, Null Sug Union All

Select 11 ID, 'אב' Hodesh,30 Yamim, Null Sug Union All

Select 12 ID, 'אלול' Hodesh,29 Yamim, Null Sug),

Shanim As

(Select    Shana,

        Meuberet,

        Molad,

        Yom,

        MeuberetKodemet,

        Cast(Null As DateTime) RoshHashanaHakodemet,

        Dhia1,

        Dhia2,

        Dhia3,

        Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End Dhia4,

        RoshHashana+Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End RoshHashana

From    (Select    *,

                Cast(DateDiff(Day,0,Molad) As DateTime)+Case When 1 In (Dhia1,Dhia2,Dhia3) Then 1 Else 0 End RoshHashana

        From    (Select    *,

                        Case When Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(12./24) Then 1 Else 0 End Dhia1,--מולד זקן

                        Case When Yom=3 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(3.+204./1080)/24 And Meuberet=0 Then 1 Else 0 End Dhia2,--ג' ט' ר"ד בשנה פשוטה

                        Case When Yom=2 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(9.+589./1080)/24 And MeuberetKodemet=1 Then 1 Else 0 End Dhia3 --ב' ט"ו תקפ"ט בפשוטה שאחרי מעוברת

                From    (Select    @Shana Shana,

                                Case When @Shana%19 In (3,6,8,11,14,17,0) Then 1

                                    Else 0

                                    End Meuberet,

                                @Molad Molad,

                                DatePart(Weekday,@Molad) Yom,

                                Case When (@Shana-1)%19 In (3,6,8,11,14,17,0) Then 1

                                    Else 0

                                    End MeuberetKodemet) T) T) T

Union All

Select    Shana,

        Meuberet,

        Molad,

        Yom,

        MeuberetKodemet,

        RoshHashanaHakodemet,

        Dhia1,

        Dhia2,

        Dhia3,

        Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End Dhia4,

        RoshHashana+Case When DatePart(WeekDay,RoshHashana) In (1,4,6) Then 1 Else 0 End RoshHashana

From    (Select    *,

                Cast(DateDiff(Day,0,Molad) As DateTime)+Case When 1 In (Dhia1,Dhia2,Dhia3) Then 1 Else 0 End RoshHashana

        From    (Select    *,

                        Case When Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(12./24) Then 1 Else 0 End Dhia1,--מולד זקן

                        Case When Yom=3 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(3.+204./1080)/24 And Meuberet=0 Then 1 Else 0 End Dhia2,--ג' ט' ר"ד בשנה פשוטה

                        Case When Yom=2 And Molad-Cast(DateDiff(Day,0,Molad) As DateTime)>(9.+589./1080)/24 And MeuberetKodemet=1 Then 1 Else 0 End Dhia3 --ב' ט"ו תקפ"ט בפשוטה שאחרי מעוברת

                From    (Select    *,

                                Case When Shana%19 In (3,6,8,11,14,17,0) Then 1

                                    Else 0

                                    End Meuberet,

                                DatePart(Weekday,Molad) Yom

                        From    (Select    Shana+1 Shana,

                                        Molad+Cast(12+Meuberet As Decimal(20,10))*@Hodesh Molad,

                                        Meuberet MeuberetKodemet,

                                        RoshHashana RoshHashanaHakodemet

                                From    Shanim) T

                        Where    Shana<@Shana+@Shanim) T) T) T)

Select    DateAdd(Day,Row_Number() Over(Partition By S.Shana Order By H.ID,H.Hodesh,Y.Yom)-1,S.RoshHashanaHakodemet) Taarih,

        S.Shana-1 Shana,

        H.Hodesh ShemHodesh,

        H.Sug SugHodesh,

        Y.Yom

From    Shanim S

Inner Join Hodashim H

        On ((S.MeuberetKodemet=0 And H.Hodesh Not In ('אדר א','אדר ב'))

                Or (S.MeuberetKodemet=1 And H.Hodesh Not In ('אדר')))

            And ((DateDiff(Day,S.RoshHashanaHakodemet,S.RoshHashana)%10=3

                    And (H.Hodesh<>'חשוון' Or H.Sug Is Null)

                    And (H.Hodesh<>'כסלו' Or H.Sug='חסר'))

                Or (DateDiff(Day,S.RoshHashanaHakodemet,S.RoshHashana)%10=4

                    And H.Sug Is Null)

                Or (DateDiff(Day,S.RoshHashanaHakodemet,S.RoshHashana)%10=5

                    And (H.Hodesh<>'חשוון' Or H.Sug='מלא')

                    And (H.Hodesh<>'כסלו' Or H.Sug Is Null)))

Inner Join Yamim Y

        On H.Yamim>=Y.Yom

Where    S.RoshHashanaHakodemet Is Not Null

Order By S.Shana,

        H.ID,

        H.Hodesh,

        Y.Yom

Option (MaxRecursion 0);

Go

clip_image006

מה הלאה?

אני אנסה בהמשך להציג דרכי חישוב נוספות.

מי שמוצא לכך שימוש- יכול לצרף טבלת חגים עבריים ובה לציין את שם החודש והתאריך, ועל ידי Left Join בין הטבלה שלי לטבלת החגים – לקבל לוח שנה עברי כולל מועדים.

מי שממש משעמם לו- יכול להוסיף חישוב של השנה העברית ושל התאריך השוטף באותיות עבריות (במקום במספרים)..

מודעות פרסומת

5 תגובות »

  1. גדול !!!

    תגובה של Lior — 09/07/2012 @ 10:28

  2. […] יותר מחצי שנה כתבתי פוסט על חישוב הלוח העברי, וציינתי בסופו שמי שרוצה- יכול לגזור ממנו בקלות את […]

    פינגבאק של מועדי ישראל - גרי רשף — 17/10/2011 @ 13:54

  3. […] יותר מחצי שנה כתבתי פוסט על חישוב הלוח העברי, וציינתי בסופו שמי שרוצה- יכול לגזור ממנו בקלות את […]

    פינגבאק של מועדי ישראל « הבלוג של גרי רשף — 17/10/2011 @ 13:53

  4. אהבתי. סחתן על ההשקעה

    תגובה של Shlomi Noach — 31/03/2011 @ 08:28

  5. יש קוד כזה שמישהו כתב בזמנו ב ASP(כולל חגים תאריכים עבריים של כל יום וכדומה), שעושה אותו הדבר, נראה לי היה יותר פשוט לקחת אותו ולתרגם ל SQL או לחליפים לעשות ממנו ASSEMBLY ולהשתמש, מאשר לכתוב ב SQL ההכל.
    מצד שני אין כמו לתרגל:)

    תגובה של פלג — 30/03/2011 @ 10:08


RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: