Why do you need to make so many new variables?
Why not just apply different formats for different levels of granularity?
You can get very close to that desired output using a PICTURE format.
data have;
input id date :datetime.;
format date datetime16.;
cards;
1 27JUL25:09:00:00
2 05AUG25:10:00:00
3 15AUG25:08:00:00
4 20AUG25:21:30:00
;
/*
Wednesday, August 27, 2025 9:00 AM
*/
proc format ;
picture mydt (default=40)
low-high= '%F, %C %d, %Y %H:%0M %p' (datatype=datetime);
;
run;
proc print data=have;
format date mydt.;
run;
Result:
Obs id date
1 1 Sunday , July 27, 2025 9:00 AM
2 2 Tuesday , August 5, 2025 10:00 AM
3 3 Friday , August 15, 2025 8:00 AM
4 4 Wednesday, August 20, 2025 21:30 PM
You might want to run it though the COMPBL() function however.
data want;
set have;
string = left(compbl(put(date,mydt.)));
run;
Result
Obs id date string
1 1 27JUL25:09:00:00 Sunday , July 27, 2025 9:00 AM
2 2 05AUG25:10:00:00 Tuesday , August 5, 2025 10:00 AM
3 3 15AUG25:08:00:00 Friday , August 15, 2025 8:00 AM
4 4 20AUG25:21:30:00 Wednesday, August 20, 2025 21:30 PM
Might need to add a TRANWRD() function call also.
string = tranwrd(left(compbl(put(date,mydt.))),' ,',',');
... View more