BookmarkSubscribeRSS Feed
sasprogramming
Quartz | Level 8

I have a dataset in sas which contains many columns. One of which is a date column called `LODGE_DATE`.

The dataset contains about 3years worth of data and will contiue to grow. I only want to export the last 12months worth of data, how can I do this without choosing the actual months to include/exclude?

'LODGE_DATE' is formatted MONYY5.

 

Thanks

6 REPLIES 6
ballardw
Super User

If your variable is an actual SAS date, not a character value or simple number that looks like JUL21 (BTW 2 digit years are a bad idea), then anything you want to use a subset based on date is a WHERE statement or data set option

 

Data want;

   set have;

   where lodge_date ge '01JAN2019'd;

run;

for example selects all observations where the date in lodge_date is 01JAN2019 or later. The date literal to compare with must be in the Date9 (or Date7) appearance with the quotes and the d. The d tells SAS you want the date value represented by the string.

 

If this doesn't work the show us Proc Contents output describing your data.

sasprogramming
Quartz | Level 8

Thanks, this works but I want it to be the last 12months regardless of what date is the last observation.

Like the logic i am after is:

 

keep rows for: (last.date - 12months)

sasprogramming
Quartz | Level 8

'LODGE_DATE' is now formatted yymmd7.

ballardw
Super User

@sasprogramming wrote:

'LODGE_DATE' is now formatted yymmd7.


FORMATS have no impact on comparison, calculation or other manipulation (unless the code explicitly uses a format to create at text value).

Kurt_Bremser
Super User

And if the "last date" is buried in an arbitrary observation, do this:

proc sql noprint;
select intnx('year',max(lodge_date),-1,'s') into :cutoff from have;
quit;

data want;
set have;
where lodge_date ge &cutoff.;
run;
mkeintz
PROC Star

If the most recent date in your dataset is the last record, then you can read that record, calculate the date 1 year before, and then use that date in a WHERE statement:

 

data _null_;
  set have point=lobs nobs=lobs;
  cut_point=intnx('year',lodge_date,-1,'S');
  call symput("cut_point",put(cut_point,date9.));
  stop;
run;
%put &=cut_point;

data want;
  set have;
  where lodge_date>="&cut_point"d;
run;

The first DATA step reads exactly one record - the last one.  The cut_point is calculated as one year earlier, and the date is written to a macrovar CUT_PONT.   The CUT_POINT text (yes, it's text, not numeric once it is a macrovar), is in date9 format (see the log for the %PUT statement).

 

Then, in the second DATA step, that macrovar fits nicely in the

   where lodge_date>="&cut_point"d ;

filter.

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

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
  • 2862 views
  • 2 likes
  • 4 in conversation