以下关于日期(月)的宏是什么。是将时间段设置为一个月,每个月设置为哪个月?

问题描述 投票:0回答:2

我正在计算使用静态日期的行数(例如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;
date macros sas
2个回答
1
投票

最后两个很简单。截止日是上个月的最后一天。最后一个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

0
投票
  1. 删除调用symput并改为创建变量。 call symput('M_StartDate', put(intnx('month', &today ,-2-M_month,'beginning'), date9.));

变为:

M_StartDate = put(intnx('month', &today ,-2-M_month,'beginning'), date9.);
  1. 今天删除&今天使用变量
  2. 添加循环以循环显示日期以查看不同的范围。 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;

然后,您可以检查输出并查看范围是什么以及它们是否符合您的预期。它看起来是一个变化的动态范围。

© www.soinside.com 2019 - 2024. All rights reserved.