SAS全局日期比较
我试图做一个日期比较,但没有得到正确的结果。有人知道发生了什么事吗SAS全局日期比较,sas,Sas,我试图做一个日期比较,但没有得到正确的结果。有人知道发生了什么事吗 %macro ttt; %let check_start = 28APR2014; %if "&check_start."d < "25may2014"d %then %let true = 1; %else %if "&check_start."d > "25may2014"d %then %let true = 2; %put &true; %mend; %
%macro ttt;
%let check_start = 28APR2014;
%if "&check_start."d < "25may2014"d %then %let true = 1;
%else %if "&check_start."d > "25may2014"d %then %let true = 2;
%put &true;
%mend;
%ttt;
14 %macro ttt;
15 %let check_start = 28APR2010;
16 %if "&check_start."d < "25may2014"d %then %let true = 1;
17 %else %if "&check_start."d > "25may2014"d %then %let true = 2;
18 %put &true;
19 %mend;
20 %ttt;
true = 2
%宏ttt;
%让我们检查一下\u start=2014年4月28日;
%如果“&check_start.”d<“2014年5月25日”d%,则%let true=1;
%否则%d如果“&check_start.”d>“2014年5月25日”d%,则%let true=2;
%把&true;
%修补;
%ttt;
14%宏观ttt;
15%让检查开始=2010年4月28日;
如果“&check_start.”d<“2014年5月25日”d%,则为16%,则为%let true=1;
17%其他%d如果“&check_start.”d>“2014年5月25日”d%,则%let true=2;
18%是正确的;
19%好转;
20%ttt;
真=2
宏变量true应等于1在这种情况下,您需要使用%sysevalf()来计算比较。下面的工作
%macro ttt;
%let check_start = 28APR2015;
%if %sysevalf("&check_start"d < '25may2014'd) %then %let true=1;
%else %if %sysevalf("&check_start."d > '25may2014'd) %then %let true=2;
%put &true.;
%mend;
%ttt;
%宏ttt;
%让我们检查一下\u start=2015年4月28日;
%如果%sysevalf(“&check_start”d<'2014年5月25日)%,则%let true=1;
%else%如果%sysevalf(&check_start.d>'2014年5月25日)%,则%let true=2;
%把它变成现实。;
%修补;
%ttt;
Reeza提供了一个很好的解决方案,但我想我也应该添加一些建议
您遇到的问题是我建议在使用宏语言时不要使用日期文字的原因。相反,我建议使用包含日期值的宏变量来代替日期文本(即“01jan2000”d
)(即%let start\u of_21世纪=%sysfunc(mdy(1,12000));
)。通过使用宏变量,不仅可以避免上述问题,而且还可以自我记录代码
目前我不知道2014年5月25日在您的代码中有什么意义,但如果您有这行代码:
%let product_launch_date = %sysfunc(mdy(5,25,2014));
。。。那么,阅读它的任何人都会清楚它的意义是什么
您的代码将变成:
%macro ttt;
%local check_start compare_date;
%let check_start = %sysfunc(mdy(4,28,2014));
%let compare_date = %sysfunc(mdy(5,25,2014));
%if &check_start < &compare_date %then %let true = 1;
%else %if &check_start > &compare_date %then %let true = 2;
%put &true;
%mend;
关于最后一个宏的一些评论。。。名为true
的宏变量已被名为check\u start\u的更具描述性的变量替换为更高的。因为我们只需要一个存储在其中的布尔值,我们可以简单地将计算表达式&check\u start>&compare\u date
的结果赋给它,该表达式将返回0(如果为false)或1(如果为true)。这比使用%if…%else…
语句执行赋值更容易理解,因为很明显代码行只是执行赋值而已
行%if&check\u start\u比较\u高%n%do代码>显示如何使用新保存的值来控制程序流。由于&check\u start\u compared\u higher
中的值解析为TRUE或FALSE,因此我们可以通过这种方式轻松地使用它,使if语句易于阅读。。我不知道%sysevalf()可以处理日期文本。很高兴知道。谢谢@Reeza。这真的很有帮助。谢谢
%macro check_dates;
%local check_start compare_date;
%let check_start = %sysfunc(mdy(4,28,2014));
%let compare_date = %sysfunc(mdy(5,25,2014));
%let check_start_compared_higher = &check_start > &compare_date;
%if &check_start_compared_higher %then %do;
%put It was higher =) ;
%end;
%else %do;
%put It was equal to or lower =( ;
%end;
%mend;
%check_dates;