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,
S.RoshHashanaHakodemet RoshHashana,
S.Meuberet,
DateDiff(Day,S.RoshHashanaHakodemet,S.RoshHashana) YamimBashana,
H.ID MisparHodesh,
H.Hodesh ShemHodesh,
H.Sug SugHodesh,
H.Yamim YamimBahodesh,
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