SAS EG:从 Today() 中提取月份以用于 IF 语句

SAS EG: Extracting Month from Today() for use in IF statement

对 SAS 比较陌生,正在寻求有关使用日期函数的帮助。

我正在使用 Today()-x 来设置日期并使其可用于查看历史数据(很少需要,但值得包括)并尝试围绕它编写一个 IF 语句,因为我需要一点财政年度末的变化。

我的代码如下:

%macro RunDate_Variables;
%global rep_month repdt prevdt;

data _null_;

    rundate = today()-0;
    runmonth = Month(rundate);

   %if runmonth eq 04
   %then %do;
   ReportDate = MDY(4, 4, Year(rundate);
   PrevReportDate = intnx('Month', ReportDate,-2,'e');
   %end;
   %else %if runmonth eq 05;
   %then %do;
   ReportDate = intnx('Month', rundate,-1,'e');
   PrevReportDate = iMDY(4, 4, Year(rundate));
   %end;
   %else %do;
   ReportDate = intnx('Month', rundate,-1,'e');
   ReportDate = intnx('Month', ReportDate,-1,'e');
   %end;


   call symputx('rep_month', put(ReportDate, MONYY7.));
   call symputx('repdt', put(ReportDate, yymmddN8.));
   call symputx('prevdt', put(PrevReportDate, yymmddn8.));

run;
%mend;
%RunDate_Variables;

不幸的是,运行月份似乎并没有按照我希望的那样进行,因此没有按预期在宏中解决。

最终,我正在寻找的是代码识别代码何时在 4 月 运行 并将 ReportingDate 设置为 4 月 4 日(财政年度结束)和 PrevReportingDate 到 28 日(或 29 日)2 月,当代码为 运行 时,5 月的 ReportingDate 设置为 4 月 30 日,PrevReportingDate 设置为 4 月 4 日。

3 月 31 日至 4 月 4 日期间 space 中的代码不需要 运行,因此将其解析到 4 月 4 日,因为 space 不会一个问题。

任何建议表示赞赏。代码不需要坚持我尝试过的格式,唯一需要保持不变的是变量名 rep_month、repdt 和 prevdt,因为这些是我选择时在整个代码中使用的名称项目起来了。

编辑:我已经设法通过在数据步骤之外使用手动调整的标志并更改 IF 条件来实现这个想法,但问题是它需要两个标志(一个用于四月,一个用于5 月),或从 Flag 中读取两个单独的输入(同样,一个识别四月,另一个识别五月)。虽然这可行,但我仍然想研究完全自动化的可能性,因为 FYE 是一个很容易记住更改标志的时间,但在 FYE 之后的一个月更改标志可能不太令人难忘。

谢谢。

您无法使用宏代码检查数据变量的值,您的 %IF 语句只是将常量字符串 runmonth 与常量字符串 04 进行比较。他们永远不会相等。

我在这里没有看到任何需要任何宏逻辑的东西,但如果您想多次调用相同的数据步骤,您仍然可以保留宏定义。

data _null_;
  rundate = today()-0;
  runmonth = Month(rundate);
  if runmonth eq 04 then do;
    ReportDate = MDY(4, 4, Year(rundate);
    PrevReportDate = intnx('Month', ReportDate,-2,'e');
  end;
  else if runmonth eq 05 then do;
    ReportDate = intnx('Month', rundate,-1,'e');
    PrevReportDate = MDY(4, 4, Year(rundate));
  end;
  else do;
    ReportDate = intnx('Month', rundate,-1,'e');
    PrevReportDate = intnx('Month', ReportDate,-1,'e');
  end;
  call symputx('rep_month', put(ReportDate, MONYY7.),'g');
  call symputx('repdt', put(ReportDate, yymmddN8.),'g');
  call symputx('prevdt', put(PrevReportDate, yymmddn8.),'g');
run;