我正在计算使用静态日期的行数(例如datefield> = 01/02/2011和datefield <= 28/02/2019),我得到x行数。我的报告是每月运行一次
由其他人开发的自动报告定义了时间段(应该是一个月),用下面的宏定义时间段。并且在报告给出y行数的同一时间段内。
有人可以解释下面的宏用英语做什么(不用说我的sas和proc sql技能非常有限)
我假设它可能选择超过一个月,因此当我计算行数时,数字的差异
/*%macro (today = );*/
option MPRINT MLOGIC symbolgen;
data _null_;
M_month = month(&today);
if M_month in (1 2 3 4 5 6) then
call symput('M_StartDate', put(intnx('month', &today ,-2-M_month,'beginning'), date9.));
else
call symput('M_StartDate', put(intnx('month', &today ,4-M_month,'beginning'), date9.));
if M_month in ( 5 6)then
call symput('M_EndDate', put(intnx('month', &today ,3-M_month,'end'), date9.));
else if M_month in ( 11 12) then
call symput('M_EndDate', put(intnx('month', &today ,9-M_month,'end'), date9.));
else
call symput('M_EndDate', put(intnx('month', &today ,-1,'end'), date9.));
call symput('M_CuttOffDate', put(intnx('month', &today , -1,'end'), date9.));
call symput('run_MMMYY', put(intnx('month', &today , 0,'end'), EURDFMY5.));
run;
最后两个很简单。截止日是上个月的最后一天。最后一个MMYY就是该格式的当前月份。
对于另外两个,它根据一年中的月份调整更改日期的数量。
要弄明白,你可能只想让自己成为一个小真值表,每年每行一行,不同目标宏变量列。因此,或许只需记下今天的月份,然后记下新宏变量的生成月份。
data _null_;
do m_month=1 to 12 ;
today = mdy(m_month,1,2018);
if M_month in (1 2 3 4 5 6) then M_StartDate = intnx('month', today ,-2-M_month,'b');
else M_StartDate = intnx('month', &today ,4-M_month,'b');
if M_month in ( 5 6)then M_EndDate = intnx('month', today ,3-M_month,'e');
else if M_month in ( 11 12) then M_EndDate = intnx('month', today ,9-M_month,'e');
else M_EndDate = intnx('month', today ,-1,'end');
put (today m_startdate m_enddate) (=yymmdd10.);
end;
run;
结果
today=2018-01-01 M_StartDate=2017-10-01 M_EndDate=2017-12-31
today=2018-02-01 M_StartDate=2017-10-01 M_EndDate=2018-01-31
today=2018-03-01 M_StartDate=2017-10-01 M_EndDate=2018-02-28
today=2018-04-01 M_StartDate=2017-10-01 M_EndDate=2018-03-31
today=2018-05-01 M_StartDate=2017-10-01 M_EndDate=2018-03-31
today=2018-06-01 M_StartDate=2017-10-01 M_EndDate=2018-03-31
today=2018-07-01 M_StartDate=2018-04-01 M_EndDate=2018-06-30
today=2018-08-01 M_StartDate=2018-03-01 M_EndDate=2018-07-31
today=2018-09-01 M_StartDate=2018-02-01 M_EndDate=2018-08-31
today=2018-10-01 M_StartDate=2018-01-01 M_EndDate=2018-09-30
today=2018-11-01 M_StartDate=2017-12-01 M_EndDate=2018-09-30
today=2018-12-01 M_StartDate=2017-11-01 M_EndDate=2018-09-30
call symput('M_StartDate', put(intnx('month', &today ,-2-M_month,'beginning'), date9.));
变为:
M_StartDate = put(intnx('month', &today ,-2-M_month,'beginning'), date9.);
data demo;
do today='01Jan2019'd to '31Dec2019'd;
M_month=month(today);
if M_month in (1 2 3 4 5 6) then
M_StartDate=put(intnx('month', today , -2-M_month, 'beginning'), date9.);
else
M_StartDate=put(intnx('month', today , 4-M_month, 'beginning'), date9.);
if M_month in (5 6)then
M_EndDate=put(intnx('month', today , 3-M_month, 'end'), date9.);
else if M_month in (11 12) then
M_EndDate=put(intnx('month', today , 9-M_month, 'end'), date9.);
else
M_EndDate=put(intnx('month', today , -1, 'end'), date9.);
M_CuttOffDate=put(intnx('month', today , -1, 'end'), date9.);
run_MMMYY=put(intnx('month', today , 0, 'end'), EURDFMY5.);
output;
end;
run;
然后,您可以检查输出并查看范围是什么以及它们是否符合您的预期。它看起来是一个变化的动态范围。