I have the following macro to calculate the number of days in a year...
%macro leapyear;
%global lyear_curr lyear_prev;
%let sysyear_curr = %sysfunc(year("&sysdate"d));
%let sysyear_prev = %sysevalf(&sysyear_curr - 1);
%let days_curr_yr = intck('days',(mdy(1,1,&sysyear_curr)),(mdy(1,1,(&sysyear_curr))),'continuous');
%let days_prev_yr = intck('days',(mdy(1,1,&sysyear_prev)),(mdy(1,1,(&sysyear_prev))),'continuous');
%put &=days_curr_yr &=days_prev_yr;
%mend;
%leapyear;I an getting errors on the sysevalf saying it is too long....probably something simple. Any ideas? I plan to use the days to check for leap year and assign a variable accordingly.
%macro leapyear;
%global lyear_curr lyear_prev;
%let sysyear_curr = %sysfunc(year("&sysdate"d));
%let sysyear_prev = %sysevalf(&sysyear_curr - 1);
%let days_curr_yr = %sysfunc(intck(day,%sysfunc(mdy(1,1,&sysyear_curr)),%sysevalf(%sysfunc(mdy(12,31,&sysyear_curr))+1)));
%let days_prev_yr = %sysfunc(intck(day,%sysfunc(mdy(1,1,&sysyear_prev)),%sysevalf(%sysfunc(mdy(12,31,&sysyear_prev))+1)));
%put &=days_curr_yr &=days_prev_yr;
%mend;
%leapyear;
%macro leapyear;
%global lyear_curr lyear_prev;
%let sysyear_curr = %sysfunc(year("&sysdate"d));
%let sysyear_prev = %sysevalf(&sysyear_curr - 1);
%let days_curr_yr = %sysfunc(intck(day,%sysfunc(mdy(1,1,&sysyear_curr)),%sysevalf(%sysfunc(mdy(12,31,&sysyear_curr))+1)));
%let days_prev_yr = %sysfunc(intck(day,%sysfunc(mdy(1,1,&sysyear_prev)),%sysevalf(%sysfunc(mdy(12,31,&sysyear_prev))+1)));
%put &=days_curr_yr &=days_prev_yr;
%mend;
%leapyear;
thx!
The number of days in the current year?
%put %eval(
%sysfunc(intnx(year,"&sysdate9"d,0,e))
-%sysfunc(intnx(year,"&sysdate9"d,0,b))
+1);
No errors:
27 %macro leapyear;
28 %global lyear_curr lyear_prev;
29
30 %let sysyear_curr = %sysfunc(year("&sysdate"d));
31 %let sysyear_prev = %sysevalf(&sysyear_curr - 1);
32
33 %let days_curr_yr = intck('days',(mdy(1,1,&sysyear_curr)),(mdy(1,1,(&sysyear_curr))),'continuous');
34 %let days_prev_yr = intck('days',(mdy(1,1,&sysyear_prev)),(mdy(1,1,(&sysyear_prev))),'continuous');
35
36 %put &=days_curr_yr &=days_prev_yr;
37 %mend;
38 %leapyear;
DAYS_CURR_YR=intck('days',(mdy(1,1,2020)),(mdy(1,1,(2020))),'continuous')
DAYS_PREV_YR=intck('days',(mdy(1,1,2019)),(mdy(1,1,(2019))),'continuous')
But, as is to be expected, the macro variables do not contain values, but the text you stored in them. Close inspection of the first macro variable shows that it would return a zero when used in a data step.
You can greatly simplify your macro by making use of the fact that dates are counts of days:
%macro leapyear;
%global lyear_curr lyear_prev;
%let lyear_curr = %eval(%sysfunc(intnx(year,%sysfunc(today()),1,b))-%sysfunc(intnx(year,%sysfunc(today()),0,b)));
%let lyear_prev = %eval(%sysfunc(intnx(year,%sysfunc(today()),0,b))-%sysfunc(intnx(year,%sysfunc(today()),-1,b)));
%mend;
%leapyear
%put &lyear_curr;
%put &lyear_prev;
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
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.