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;