BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Pili1100
Obsidian | Level 7
DATA WORK.HAVE;
INFILE DATALINES DELIMITER =','; 
FORMAT Date YYMMDD10. ;
INPUT DATE YYMMDD10. X  ;
CARDS; 
2021-08-17,99,
2021-09-01,505,
2021-10-05,91,
2021-11-05,65,
2021-12-07,250,
2022-01-01,704,
2022-02-02,687,
2022-03-03,123,
2022-04-03,456,
2022-05-06,789,
2022-06-16,687,
2022-07-27,123,
2022-08-05,400,
2022-09-05,700,
2022-10-22,850,
2022-11-18,700,
2022-12-07,120,
2023-01-27,123,
2023-02-05,400,
2023-03-07,700,
2023-04-22,850,
2023-05-18,700,
2023-06-07,120,
;
RUN;

DATA have;
SET have;
row= _n_;
RUN;


DATA cond_1;
FORMAT today YYMMDD10.;
SET have;
row= _n_;
/*If today's date is... */
today = '15MAR2022'd;

/*Then these rows are the rows I want  */
IF row >2 AND row < 9 THEN DO;  
condition_1 = 'Yes';
OUTPUT;
END;

RUN;


DATA cond_2;
FORMAT today YYMMDD10.;
SET have;
row= _n_;
/*If today's date is... */
today = '15MAY2023'd;

/*Then these rows are the rows I want  */
IF row >8 AND row < 22 THEN DO;  
condition_2 = 'Yes';
OUTPUT;
END;

RUN;

How do I change a WHERE/ or IF THEN-condition depending on which date it is?

 

I have two conditions:

 

Condition 1

If today's date is between 1st of JAN 2022 to 31st of OCT 2022 = table contains data from

1st of OCT 2021 (WHERE DATE >= ‘01OCT2021’d)

 

Condition 2

If today's date is greater than or equal to 1st of NOV 2022 = table contains data within a period of 13 months

(WHERE DATE >= INTNX(‘month’, XXX, -13, ‘B’)

 

Se my example  tables. I use variable row just to illustrate the rows I want.

1 ACCEPTED SOLUTION

Accepted Solutions
4 REPLIES 4
Kurt_Bremser
Super User

Try this:

data want,
set have;
if '01jan2022'd le today() le '31oct2022'd
then cutoff = '01oct2021'd,
else cutoff = intnx('month',today(),-13,'b');
if date ge cutoff;
drop cutoff;
run;
Pili1100
Obsidian | Level 7

 

Played around a bit with your code and it worked like a charm! 

Thanks Kurt.

😁

%LET generic_today=today()+780;
data want;
FORMAT generic_today Cutoff YYMMDD10.;
set have;
generic_today = &generic_today;
if '01jan2022'd le generic_today le '31oct2022'd
then cutoff = '01oct2021'd;
else cutoff = intnx('month',generic_today,-13,'b');
if date ge cutoff;
/*drop cutoff;*/
run;

 

ballardw
Super User

I really hope that your program documentation discusses exactly why you have a +780 in it.

 

Such magic numbers are one of the banes of the next person to use your code, or if you don't revisit it for a long time, especially if the macro variables are set somewhere not in close proximity to the code where it is used.

 


@Pili1100 wrote:

 

Played around a bit with your code and it worked like a charm! 

Thanks Kurt.

😁

%LET generic_today=today()+780;
data want;
FORMAT generic_today Cutoff YYMMDD10.;
set have;
generic_today = &generic_today;
if '01jan2022'd le generic_today le '31oct2022'd
then cutoff = '01oct2021'd;
else cutoff = intnx('month',generic_today,-13,'b');
if date ge cutoff;
/*drop cutoff;*/
run;

 


 

Pili1100
Obsidian | Level 7

I was trying lots of different number so as to change the date, for the the geneteric_today date. +780 was the last one I tried

Anything thing particular you think I should add? 🙂 

 

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
  • 4 replies
  • 469 views
  • 0 likes
  • 3 in conversation