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