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.
Includes four measures, one for each equinox and one for each solstice. They are identical except for the RETURN statement. Based upon Jean Meeus' Astrological Algorithms.
March Equinox =
// Based on Jean Meeus' Astrological Algorithms
VAR __Table26ab =
DATATABLE(
"Index", INTEGER,
"Description", STRING,
"Y4", DOUBLE,
"Y3", DOUBLE,
"Y2", DOUBLE,
"Y", DOUBLE,
"Constant", DOUBLE,
{
{ 1, "March equinox 1001+", -0.00057, -0.00411, 0.05169, 365242.37404, 2451623.80984},
{ 2, "June solstice 1001+", -0.0003, 0.00888, 0.00325, 365241.62603, 2451716.56767},
{ 3, "September equinox 1001+", 0.00078, 0.00337, -0.11575, 365242.01767, 2451810.21715},
{ 4, "December solstice 1001+", 0.00032, -0.00823, -0.06223, 365242.74049, 2451900.05952},
{ 5, "March equinox <1000", -0.00071, 0.00111, 0.06134, 365242.13740, 1721139.29189},
{ 6, "June solstice <1000", 0.00025, 0.00907, -0.05323, 365241.72562, 1721233.25401},
{ 7, "September equinox <1000", 0.00074, -0.00297, -0.11677, 365242.49558, 1721325.70455},
{ 8, "December solstice <1000", -0.00006, -0.00933, -0.00769, 365242.88257, 1721414.39987}
}
)
VAR __Table26c =
DATATABLE(
"A", INTEGER,
"B", DOUBLE,
"C", DOUBLE,
{
{ 485, 324.96, 1934.136 },
{ 203, 337.23, 32964.467 },
{ 199, 342.08, 20.186 },
{ 182, 27.85, 445267.112 },
{ 156, 73.14, 45036.886 },
{ 136, 171.52, 22518.443 },
{ 77, 222.54, 65928.934 },
{ 74, 296.72, 3034.906 },
{ 70, 243.58, 9037.513 },
{ 58, 119.81, 33718.147 },
{ 52, 297.17, 150.678 },
{ 50, 21.02, 2281.226 },
{ 45, 247.54, 29929.562 },
{ 44, 325.15, 31555.956 },
{ 29, 60.93, 4443.417 },
{ 18, 155.12, 67555.328 },
{ 17, 288.79, 4562.452 },
{ 16, 198.04, 62894.029 },
{ 14, 199.76, 31436.921 },
{ 12, 95.39, 14577.848 },
{ 12, 287.11, 31931.756 },
{ 12, 320.81, 34777.259 },
{ 9, 227.73, 1222.114 },
{ 8, 15.45, 16859.074}
}
)
VAR __Year = MAX('Years'[Year])
VAR __Y = IF(__Year<=1000, __Year / 1000, (__Year - 2000)/1000)
VAR __JDE = ADDCOLUMNS(__Table26ab,"JDE",[Constant] + [Y]*__Y + [Y2]*__Y^2 + [Y3]*__Y^3 + [Y4]*__Y^4)
VAR __T = ADDCOLUMNS(__JDE, "T", ([JDE] - 2451545.0) / 36525)
VAR __W = ADDCOLUMNS(__T, "W", 35999.373 * [T] - 2.47)
VAR __DeltaLambda = ADDCOLUMNS(__W, "DeltaLambda", 1 + 0.0334 * COS(RADIANS([W])) + 0.0007 * COS( RADIANS(2 * [W])))
VAR __S = ADDCOLUMNS(__DeltaLambda,"S",SUMX(ADDCOLUMNS(__Table26c,"S",[A] * COS(RADIANS([B] + [C] * [T]))),[S]))
VAR __JDEFinal = ADDCOLUMNS(__S, "JDEFinal",[JDE] + 0.00001*[S]/[DeltaLambda])
VAR __Z = ADDCOLUMNS(__JDEFinal,"Z", INT([JDEFinal] + .5))
VAR __F = ADDCOLUMNS(__Z, "F", [JDEFinal] + .5 - [Z])
VAR __A =
ADDCOLUMNS(
__F,
"A",
IF(
[Z] < 2299161,
[Z],
VAR __alpha = INT( ([Z] - 1867216.25) / 36524.25)
RETURN
[Z] + 1 + __alpha - INT(__alpha/4)
)
)
VAR __B = ADDCOLUMNS(__A, "B", [A] + 1524)
VAR __C = ADDCOLUMNS(__B, "C", INT( ([B] - 122.1)/365.25))
VAR __D = ADDCOLUMNS(__C, "D", INT(365.25 * [C]))
VAR __E = ADDCOLUMNS(__D, "E", INT( ([B] - [D])/30.6001))
VAR __Day = ADDCOLUMNS(__E, "Day", [B] - [D] - INT(30.6001 * [E]))
VAR __Month = ADDCOLUMNS(__Day, "Month", IF([E] < 14, [E] - 1, [E] - 13))
VAR __Year1 = ADDCOLUMNS(__Month, "Year", IF([Month] > 2, [C] - 4716, [C] - 4715))
VAR __Final = ADDCOLUMNS(__Year1, "Date", DATE([Year],[Month],[Day]) + [F])
VAR __MarchEquinox = IF(__Year > 1000, MAXX(FILTER(__Final, [Index] = 1),[Date]), MAXX(FILTER(__Final, [Index] = 5),[Date]))
VAR __JuneSolstice = IF(__Year > 1000, MAXX(FILTER(__Final, [Index] = 2),[Date]), MAXX(FILTER(__Final, [Index] = 6),[Date]))
VAR __SeptemberEquinox = IF(__Year > 1000, MAXX(FILTER(__Final, [Index] = 3),[Date]), MAXX(FILTER(__Final, [Index] = 7),[Date]))
VAR __DecemberSolstice = IF(__Year > 1000, MAXX(FILTER(__Final, [Index] = 4),[Date]), MAXX(FILTER(__Final, [Index] = 8),[Date]))
RETURN
__MarchEquinox
For MSHGQM, use this for the __Year variable:
eyJrIjoiNzBkZjUxY2YtMmZhNC00ZmNkLWJkODUtMjU2ZWY2MmRhMzdmIiwidCI6IjRhMDQyNzQzLTM3M2EtNDNkMi04MjdiLTAwM2Y0YzdiYTFlNSIsImMiOjN9