If you don't tell INTNX() where in the interval you want to move to it moves to the beginning. Use the last parameter to adjust that.
All months don't have the same number of days. So the order you do the operations will make a difference.
Note there is no need to use INTNX() to move by days. Dates are just stored as the number of days since 1960 so you can use simple addition or subtraction to move by days.
data test;
do date='01MAR2019'd to '01APR2019'd;
date_minus_month=intnx('month',date,-1,'same');
date_plus9=date+9;
date1=intnx('month',date,-1,'same')+9;
date2=intnx('month',date+9,-1,'same');
output;
end;
format date: date9.;
run;
proc print;
where date1 ne date2;
run;
date_
minus_ date_
Obs date month plus9 date1 date2
20 20MAR2019 20FEB2019 29MAR2019 01MAR2019 28FEB2019
21 21MAR2019 21FEB2019 30MAR2019 02MAR2019 28FEB2019
22 22MAR2019 22FEB2019 31MAR2019 03MAR2019 28FEB2019
23 23MAR2019 23FEB2019 01APR2019 04MAR2019 01MAR2019
24 24MAR2019 24FEB2019 02APR2019 05MAR2019 02MAR2019
25 25MAR2019 25FEB2019 03APR2019 06MAR2019 03MAR2019
26 26MAR2019 26FEB2019 04APR2019 07MAR2019 04MAR2019
27 27MAR2019 27FEB2019 05APR2019 08MAR2019 05MAR2019
28 28MAR2019 28FEB2019 06APR2019 09MAR2019 06MAR2019
29 29MAR2019 28FEB2019 07APR2019 09MAR2019 07MAR2019
30 30MAR2019 28FEB2019 08APR2019 09MAR2019 08MAR2019
So for the first example where the two methods give different results you see that adding 9 days moves to MAR29. When you then ask INTNX to move back to the same day in Feb there is no FEB29 so you end up with FEB28. But if you first move back to FEB20 and add 9 days you end up on MAR01.
... View more