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;
对 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;