¿Hay un equivalente de la función EOMonth de Excel en JMP?Todos,
¿Tratar de ver hay un equivalente de la función EOMonth de Excel en JMP? Intenté reescribirlo como una función definida por el usuario. Si bien funciona con la mayoría de los casos, mi código falla en algunos casos. ¿Intento ver si hay una función incorporada que JMP ofrece antes de que dedique más tiempo a esto?
Fuente para la captura de pantalla: ExcelJet

Re: ¿Hay un equivalente de la función EOMonth de Excel en JMP?Aquí hay otra versión que podría ser útil. Este tiene la ventaja de poder aceptar los argumentos negativos de MonthToEval y también evita tener que probar varias fechas para ver si la fecha es válida o no.
Mi cambio clave aquí fue adelantar el mes un mes adicional, y usar Fecha MDY () para obtener el primer día del mes siguiente, y luego restar un día de la respuesta final.
EOMONTH = Function( {Date, MonthToEval},
{Date, MonthToEval, EvalMonth, EvalYear, ReturnDate},
EvalMonth = Month( Date ) + MonthToEval + 1;
EvalYear = Year( Date );
While( EvalMonth > 12, EvalMonth-=12; EvalYear++; );
While( EvalMonth < 1, EvalMonth+=12; EvalYear--; );
ReturnDate = Date MDY( EvalMonth, 1, EvalYear ) - In Days( 1 );
);Re: ¿Hay un equivalente de la función EOMonth de Excel en JMP?Aquí hay una versión alternativa de la misma función. Utiliza un algoritmo más simple.
EOMONTH = Function( {Date, MonthToEval},
{Date, MonthToEval, EvalMonth, EvalYear, EvalDay, ReturnDate},
EvalMonth = Month( Date );
EvalYear = Year( Date );
If( EvalMonth + MonthToEval > 12,
EvalMonth = EvalMonth + MonthToEval - 12;
EvalYear = EvalYear + 1;
,
EvalMonth = EvalMonth + MonthToEval
);
EvalDay = 28;
While( Is Missing( Date MDY( EvalMonth, EvalDay, EvalYear ) ) == 0,
ReturnDate = Date MDY( EvalMonth, EvalDay, EvalYear );
EvalDay = EvalDay + 1;
);
ReturnDate;
);
mydate = Date MDY( 2, 20, 2020 );
mymonth = 0;
Show( Format( eomonth( mydate, mymonth ), "mm/dd/yyyy" ) );Re: ¿Hay un equivalente de la función EOMonth de Excel en JMP?Bueno, supongo que lo descubrí, pero si alguien encuentra una solución más fácil / mejor / robusta, por favor, comparta, no duele.
IsLeapYear = function({Input_Year},{Default Local},
If(Is String(Input_Year),
Input_Year = Num(Input_Year);
);
If( (Mod(Input_Year,400) == 0 | (Mod(Input_Year,4) == 0 & Mod(Input_Year,100)!= 0)),
return(1);
,
return(0);
);
);
EOMonth = function({Start_Date,Months},{Default Local},
NewDate = Date Increment(Start_Date,"Month",Months,"start");
NewMonth = Month(NewDate);
NewDay = Day(NewDate);
NewYear = Year(NewDate);
If(Contains({1,3,5,7,8,10,12},NewMonth),
NewDay = 31;
,
If(Contains({4,6,9,11},NewMonth),
NewDay = 30;
,
If(NewMonth == 2,
If(IsLeapYear(NewYear),
NewDay = 29;
,
NewDay = 28;
);
);
);
);
// Return Result
return(Date MDY(NewMonth,NewDay,NewYear));
);
Start_Date = Date MDY(2,15,2015);
Months = -15;
Show(As Date(Start_Date));
NewDate = EOMonth(Start_Date,Months);
Show(As Date(NewDate));