Hi,
I am creating a macro variable
%let month_to_process = july;
How do I extract the first day and last day of the month to be used in a series of if conditions below?
data elig_subset_08092017;
set elig_subset;
/*for july*/
if datepart(EFFECTIVE_DT)>'31jul2017'd then
do;
effective_date_july =.;
term_date_july =.;
end;
else if datepart(EFFECTIVE_DT) le '31jul2017'd and datepart(EFFECTIVE_DT) ge '01jul2017'd then
do;
if datepart(term_date)>'31jul2017'd then
do;
effective_date_july =datepart(EFFECTIVE_DT);
term_date_july ='31jul2017'd;
end;
else
do;
effective_date_july =datepart(EFFECTIVE_DT);
term_date_july =datepart(term_date);
end;
end;
else if datepart(EFFECTIVE_DT) < '01jul2017'd then
do;
if datepart(term_date)<'01jul2017'd then
do;
effective_date_july =.;
term_date_july =.;
end;
else if (datepart(term_date) ge '01jul2017'd) and (datepart(term_date) le '31jul2017'd) then
do;
effective_date_july = '01jul2017'd;
term_date_july =datepart(term_date);
end;
else if datepart(term_date)>'31jul2017'd then
do;
effective_date_july ='01jul2017'd;
term_date_july ='31jul2017'd;
end;
end;
run;
Appreciate any help.
Thanks ,
Regards,
Sheeba
Use the intnx() function with 'month' and 'begin' and 'end'.
Hi KurtBremser ,
Thanks a lot for the reply.
I used the INTNX function and got the required results
Regards,
Sheeba
SAS supports comparisons like 5 < variable < 25
so you can make this code
else if datepart(EFFECTIVE_DT) le '31jul2017'd and datepart(EFFECTIVE_DT) ge '01jul2017'd then
into this:
else if '01jul2017'd le datepart(EFFECTIVE_DT) le '31jul2017'd then
But even easier unless your data is multiyear:
else if month(datepart(effective_dt))=7;
If you are going to use datepart(effictive_dt) so many places you might as well make a temporary variable to make code easier to read.
You might discuss the purpose of those If conditions.
Hi ballardw,
Thanks a lot for the detailed reply and tips .
I added a variable to hold the date part and used the le operator as suggested.
I used the if conditions to check if the person is active for the month. so in case the person is active for a month, i just want the effective date and term date to be set as first and last of the month. so if a person is active starting from previous month to next month , i just want start date july and end date july as first and last of the month.
Thanks again
Regards,
Sheeba
I am not sure you are starting with enough information.
%let month_to_process = july;
For what year do you want JULY dates for? 2017? 2016? 2018?
If you start with a date value.
%let month_to_process = '01JUL2017'd;
Then you could use INTNX() function to find the first and last day of that month.
%let firstday=%sysfunc(intnx(month,&month_to_process,0,b));
%let lastday=%sysfunc(intnx(month,&month_to_process,0,e));
Of if you would prefer human readable values then perhaps you could generate them as date literals.
%let firstday="%sysfunc(intnx(month,&month_to_process,0,b),date9)"d;
%let lastday="%sysfunc(intnx(month,&month_to_process,0,e),date9)"d;
Hi Tom,
Thanks a lot for the details and code.
I used this and is working successfully.
Thanks,
Regards,
Sheeba
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!
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.