Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.
OK, got smart about Orthodox Easter from here: https://www.assa.org.au/edm. Note, Orthodox Pentecost is +49 days.
Orthodox Easter =
// Reference https://www.assa.org.au/edm
VAR __Year = MAX('Date'[Year])
VAR __First2 = TRUNC(__Year / 100)
VAR __Last2 = RIGHT(__Year & "", 2) + 0
VAR __Divide19 = TRUNC(__Year / 19)
VAR __Fraction = MOD(__Year, 19)
VAR __TableA =
DATATABLE(
"Fraction", DOUBLE,
"PFM Date", STRING,
{
{0, "A05"}, {1, "M25"}, {2, "A13"}, {3, "A02"}, {4, "M22"}, {5, "A10"},
{6, "M30"}, {7, "A18"}, {8, "A07"}, {9, "M27"}, {10, "A15"}, {11, "A04"},
{12, "M24"}, {13, "A12"}, {14, "A01"}, {15, "M21"}, {16, "A09"}, {17, "M29"}, {18, "A17"}
}
)
VAR __PFM = MAXX(FILTER(__TableA, [Fraction] = __Fraction),[PFM Date])
VAR __B =
SWITCH(TRUE(),
__PFM IN { "M26", "A02", "A09", "A16" }, 0,
__PFM IN { "M27", "A03", "A10", "A17" }, 1,
__PFM IN { "M21", "M28", "A04", "A11", "A18" }, 2,
__PFM IN { "M22", "M29", "A05", "A12" }, 3,
__PFM IN { "M23", "M30", "A06", "A13" }, 4,
__PFM IN { "M24", "M31", "A07", "A14" }, 5,
6
)
VAR __C =
SWITCH(TRUE(),
__First2 IN { 13, 20, 27 },6,
__First2 IN { 14, 21, 28 },5,
__First2 IN { 15, 22, 29 },4,
__First2 IN { 16, 23, 30 },3,
__First2 IN { 10, 17, 24, 31 },2,
__First2 IN { 11, 18, 25, 32 },1,
0
)
VAR __D =
SWITCH(TRUE(),
__Last2 IN { 0, 6, 17, 23, 28, 34, 45, 51, 56, 62, 73, 79, 84, 90 },0,
__Last2 IN { 1, 7, 12, 18, 29, 35, 40, 46, 57, 63, 68, 74, 85, 91, 96 },1,
__Last2 IN { 2, 13, 19, 24, 30, 41, 47, 52, 58, 69, 75, 80, 86, 97 },2,
__Last2 IN { 3, 8, 14, 25, 31, 36, 42, 53, 59, 64, 70, 81, 87, 92, 98 },3,
__Last2 IN { 9, 15, 20, 26, 37, 43, 48, 54, 65, 71, 76, 82, 93, 99 },4,
__Last2 IN { 4, 10, 21, 27, 32, 38, 49, 55, 60, 66, 77, 83, 88, 94 },5,
6
)
VAR __WeekDayLookup = __B + __C + __D
VAR __DaysToAdd =
SWITCH(TRUE(),
__WeekDayLookup IN { 0, 7, 14 },7,
__WeekDayLookup IN { 1, 8, 15 },6,
__WeekDayLookup IN { 2, 9, 16 },5,
__WeekDayLookup IN { 3, 10, 17 },4,
__WeekDayLookup IN { 4, 11, 18 },3,
__WeekDayLookup IN { 5, 12 },2,
1
)
VAR __Month1 = IF(LEFT(__PFM,1)="M",3,4)
VAR __Day1 = RIGHT(__PFM,2) * 1 + __DaysToAdd
VAR __Month = IF(__Day1 > 31 && __Month1 = 3, 4, __Month1)
VAR __Day = IF(__Day1 > 31, __Day1 - 31, __Day1)
VAR __JulianDate = DATE(__Year, __Month, __Day)
VAR __GregorianDate =
SWITCH(TRUE(),
__Year <= 1699, __JulianDate + 10,
__Year <= 1799, __JulianDate + 11,
__Year <= 1899, __JulianDate + 12,
__Year <= 2099, __JulianDate + 13,
__Year <= 2199, __JulianDate + 14,
__Year <= 2299, __JulianDate + 15,
__Year <= 2499, __JulianDate + 16,
__Year <= 2599, __JulianDate + 17,
__Year <= 2699, __JulianDate + 18,
__Year <= 2899, __JulianDate + 19,
__Year <= 2999, __JulianDate + 20,
__Year <= 3099, __JulianDate + 21,
__Year <= 3299, __JulianDate + 22,
__Year <= 3399, __JulianDate + 23
)
RETURN
__GregorianDate
eyJrIjoiY2Y3NmIzMjItYmYzMS00MjY2LTk5NzEtOTUzMjk2NjA0MzA0IiwidCI6IjRhMDQyNzQzLTM3M2EtNDNkMi04MjdiLTAwM2Y0YzdiYTFlNSIsImMiOjN9