BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
jswinford
Obsidian | Level 7

I'm trying to merge a date field from numeric year, day, and month to a character yyyymmdd to fit with another dataset.  Originally when I ran the code it gave the length of the new field $600 for some reason, so I tried modifying the lengths myself.  Now it's saying that the fields I'm trying to combine are defined as both numeric and character, and it won't combine them.  I'm confused how this happened.

 

CBPdata is my input, date is my output.  My original variables were Month, Day, and Year and I want to create the variable STADATE with yyyymmdd format.

 

Here is my code

 

data work.date;
format mon $char2.;
informat mon $char2.;
mon=cat(Month);
if Month=1 then mon='01';
if Month=2 then mon='02';
if Month=3 then mon='03';
if Month=12 then mon='12';
format d $char2.;
informat d $char2.;
d=cat(Day);
if day=1 then d='01';
if day=2 then d='02';
if day=3 then d='03';
if day=4 then d='04';
if day=5 then d='05';
if day=6 then d='06';
if day=7 then d='07';
if day=8 then d='08';
if day=9 then d='09';
format yr $char4.;
informat yr $char4.;
yr=cat(Year);

STADATE = yr||mon||d;

set work.date;
run;

1 ACCEPTED SOLUTION

Accepted Solutions
Tom
Super User Tom
Super User

Your data step looks wrong.

You have assignment statements before the SET statement.

You appear to be using FORMAT statements to define variables. You should be to use LENGTH or ATTRIB statement to define a varaible.

 

Also don't overwrite your input data, especially if you are not sure the code works.

data want;
  set have ;
  length new_char_date $8 ;
  new_char_date = put( mdy(month,day,year), yymmddn8.);
run;

View solution in original post

6 REPLIES 6
PaigeMiller
Diamond | Level 26

PPlease show us (a portion of) the data in both data sets.

--
Paige Miller
Tom
Super User Tom
Super User

Your data step looks wrong.

You have assignment statements before the SET statement.

You appear to be using FORMAT statements to define variables. You should be to use LENGTH or ATTRIB statement to define a varaible.

 

Also don't overwrite your input data, especially if you are not sure the code works.

data want;
  set have ;
  length new_char_date $8 ;
  new_char_date = put( mdy(month,day,year), yymmddn8.);
run;
jswinford
Obsidian | Level 7

I've tried putting the SET statements where the should be (at the top), and then SAS keeps telling me I need to put LENGTH before SET in the Log.  So I've already tried doing that.  

I tried using LENGTH to change the length but it wouldn't let me do that either so I used FORMAT and that changed the length and format in the code

 

I was "overwriting" the input because for some reason, simple coding isn't working.  Starting to wonder if there's something wrong with the input file.  

 

I am going to see if your code works.  

jswinford
Obsidian | Level 7

Thanks,

 

I'm not sure what was going on.  I was working off of another code that I had used to do this before and for some reason it wasn't working this time.  That's why I come here haha.

Tom
Super User Tom
Super User

@jswinford wrote:

I've tried putting the SET statements where the should be (at the top), and then SAS keeps telling me I need to put LENGTH before SET in the Log.  So I've already tried doing that.  

I tried using LENGTH to change the length but it wouldn't let me do that either so I used FORMAT and that changed the length and format in the code

 

I was "overwriting" the input because for some reason, simple coding isn't working.  Starting to wonder if there's something wrong with the input file.  

 

I am going to see if your code works.  


You cannot change the LENGTH of a character variable after SAS has already defined the variable. So if the source dataset already have a variable named CHAR_DATE then putting the LENGTH statement after the SET statement will generate a warning from SAS and be ignored.  You can change the FORMAT attached to a variable, but that just changes how it is displayed and not how long it really is.  So you could attach $600. format to variable that has length of $10 (and the reverse!).  

 

Most likely the problems you had with using the LENGTH statement were related to using the same dataset name for the input and output of the data step and running the step more than once.  So the first time the LENGTH statement defined a new varaible, but then when you ran it again reading the updated dataset it will ignore the LENGTH statement since the variable was already defined.  You can use the DROP= dataset option to eliminate a variable that you want to recreate from other data.

Reeza
Super User

Use the MDY() function, the following creates a SAS date called myDate and then a character date from it, called myDate_Char. 

 

myDate = mdy(month, day, year);
format myDate yymmdd10.;

myDate_Char = put(myDate, yymmddn8.);

You also have your SET statement after your code. I suspect that might introduce some behaviour you're not expecting. I'd put it at the top of your code.

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 6 replies
  • 4718 views
  • 1 like
  • 4 in conversation