I have an outpatient dataset with a variable "FRDATE" that is formatted numeric 8. Each observation has either 7 numbers (ddmyyyy) or 8 numbers (ddmmyyyy). How do I convert this numeric field to a unified date field?
Ex: Patient FRDATE
Obs 1 2162016
Obs 2 21122016
Thanks!
Is that first "date" supposed to be Feb 16 2016 or June 21 2016?
Did the original data brought into SAS actually have leading zeros such that the first example was 02162016, which would maybe clear up the above question?
If so perhaps:
data have; input frdate; sasdate= input(put(frdate,z8.-L),anydtdte.); format sasdate mmddyy10.; datalines; 2162016 21122016 ; run;
The line is the SASDATE= which reads in a text version of your date with a leading 0 using an "any date" informat (anydtdte.)
Is that first "date" supposed to be Feb 16 2016 or June 21 2016?
Did the original data brought into SAS actually have leading zeros such that the first example was 02162016, which would maybe clear up the above question?
If so perhaps:
data have; input frdate; sasdate= input(put(frdate,z8.-L),anydtdte.); format sasdate mmddyy10.; datalines; 2162016 21122016 ; run;
The line is the SASDATE= which reads in a text version of your date with a leading 0 using an "any date" informat (anydtdte.)
Thank you all so much for the quick replies and solutions. This agency sent me 5 years to merge, each year in a a text file with a different delineation and data dictionary... my eyes are crossing
Hi you can try like this
data date;
input patient$ date;
cards;
Obs_1 2162016
Obs_2 21122016
;
run;
data date1;
set date;
date1=input(date,8.);
format date1 ddmmyy10.;
run;
You can check length of the char type var:
length temp_date $8;
temp_date = put(frdate, 8.);
if length(temp_date) = 7
then tempdate = cat(substr(temp_date,1,2) , '0' ,
substr(temp_date,3,5) );
frdtae = input(temp_date, ddmmyy8.);
I think you're omitting a case here. Couldn't January 1, 2016 be represented as 6 digits?
Anyway, taking your rule that these are actually numeric variables, I would create a character version that contains 8 digits. For example:
if frdate > 10000000 then char_version = put(frdate, 8.);
else if frdate > 1000000 then do;
frdate = 10 * int(frdate / 10000) + mod(frdate, 10000);
char_version = put(frdate, 8.);
end;
else if frdate > 100000 then do; /* to handle 112016 = January 1, 2016 */
frdate = 100 * int(frdate / 10000) + mod(frdate, 10000);
char_version = put(frdate, 8.);
end;
Finally, convert that character version to a valid SAS date.
fr_sasdate = input(put(char_version, z8.), ddmmyy8.);
format fr_sasdate yymmdd10.; /* or pick some other format that you prefer */
The code is untested at the moment, so I may tweak it.
***************** EDITED:
Upon review of the results of this code, there are more problems than expected. For example, how do you know what date this is:
1112016
SAS will make the choice for you, but how will you know that SAS did the right thing?
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.
Ready to level-up your skills? Choose your own adventure.