There are 24 hours in a day, 7 days in a week and 52 weeks in a year - until there are 53. I have an application that needs to know how many Fridays ( day of week = 6 ) fall in a year. Since 1999 to 2016 the following years have 53 Fridays in a year: 1999, 2004, 2010 and 2016.
The below function will return a value of 52 or 53 as both a custom function and then as a macro function.
proc fcmp outlib = work.functions.utilies ;
function weeksperyear( weekday, year ) ;
if year( intnx( 'week.6', nwkdom( 1, weekday, 1, year ), 52 ) ) = year then retval = 53 ;
else retval = 52 ;
return ( retval ) ;
endsub ;
run ;
options cmplib = ( work.functions ) ;
data x ;
do year = 1992 to 2016 ;
weeks = weeksperyear( 6, year ) ;
output ;
end ;
run ;
/**************************************************************************
* Program: weeksperyear.sas
* Author: Tom Bellmer
* Created: 07NOV2014
* Purpose: returns either 52 or 53 weeks
* Usage: %weeksperyear( weekday = 6, year = 2014 )
* Notes: weekday= day of the week with 1 = Sun, 2 = Mon ... 7 = Sat
**************************************************************************/
%macro weeksperyear( weekday = 6, year = 2014 ) ;
%local retval ;
%if &weekday. eq %then %do ;
%put %str(E)RROR: Invalid weekday value of &weekday. ;
%return ;
%end ;
%if &year. eq %then %do ;
%put %str(E)RROR: Invalid year value of &year. ;
%return ;
%end ;
%if %eval( %sysfunc( year(
%sysfunc( intnx( week.6
, %sysfunc( nwkdom( 1, &weekday., 1, &year. ) )
, 52 )
)
)
) = &year. ) %then %let retval = 53 ;
%else %let retval = 52 ;
&retval.
%mend ;
/* EOF: weeksperyear.sas */
No comments:
Post a Comment