BookmarkSubscribeRSS Feed
rajeshalwayswel
Pyrite | Level 9
data have;
input date $15.;
cards;
UN-UNK-2019
UN-NOV-2010
UN-JAN-2019
10-JAN-2018
;
run;

Want:

2019-UNK-UN
2010-11-UN
2019-01-UN
2018-01-10
2 REPLIES 2
Jagadishkatam
Amethyst | Level 16

please try

 

data have;
input date $15.;
if scan(date,2,'-') ne 'UNK' then do;
month=month(input(cats('01',scan(date,2,'-'),'2019'),date9.));
date2=tranwrd(date,scan(date,2,'-'),put(month,z2.));
end;
else date2=date;
newdate=prxchange('s/(.*)\-(.*)\-(.*)/$3-$2-$1/',-1,strip(date2));
cards;
UN-UNK-2019
UN-NOV-2010
UN-JAN-2019
10-JAN-2018
;
run;
Thanks,
Jag
Kurt_Bremser
Super User

You really do not "convert" here, you just reshuffle and reformat the values. Your output does not constitute dates, as dates always refer to a specific day within a specific month within a specific year. Basically, you don't change anything to the better.

Since you have incomplete values in your input, I suggest two possible approaches:

  • set up a rule how to replace "UN" and "UNK" with specific days and months, so you can have complete SAS dates
  • store separate year, month and day values, and set the "UN" and "UNK" to missing; that way you can always decide later how to treat those missing values within the context of your analysis, and non-missing values can be assembled into a date with the mdy() function.
How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 2 replies
  • 2008 views
  • 2 likes
  • 3 in conversation