如何在SAS中计算宏变量的数据类型

如何在SAS中计算宏变量的数据类型,sas,sas-macro,Sas,Sas Macro,如何打印日志中宏变量的数据类型 %macro mymacro(dt2); %LET c_mth = %SYSFUNC(intnx(month,&dt2.d,-1,e),date9.) ; %put &c_mth; %mend; mymacro('01sep2014') 我使用%let或into分配了一组宏变量: 我的问题是,我试图对日期执行一系列布尔条件,但我怀疑我的一些变量是字符串,一些是日期 我已经在我的代码中铸造了它们,但要进行三重检查,肯定有一种

如何打印日志中宏变量的数据类型

%macro mymacro(dt2);


    %LET c_mth = %SYSFUNC(intnx(month,&dt2.d,-1,e),date9.) ;
    %put &c_mth;

%mend;

mymacro('01sep2014')
我使用%let或into分配了一组宏变量: 我的问题是,我试图对日期执行一系列布尔条件,但我怀疑我的一些变量是字符串,一些是日期 我已经在我的代码中铸造了它们,但要进行三重检查,肯定有一种方法可以将某些内容返回到日志中


我想要类似于在R中使用str()或mode()或is.numeric()的宏变量没有类型,它们都是文本

您必须确保以对程序有意义的方式传递变量,并生成有效的SAS代码

%let date1=01Jan2014;
%let date2=31Jan2014;

data _null_;

x = "&date1"d > "&date2"d;
y = "&date2"d > "&date1"d;
z = "&date2"d-"&date1"d;

put 'x=' x;
put 'y=' y;
put 'z=' z;

run;
日志应显示: x=0 y=1 z=30

SAS宏语言很奇怪。:)

正如Reeza所说,宏变量没有类型,它们都是文本

但是,如果使用布尔逻辑(%if语句),并且两个操作数都是整数,则宏语言将进行数值比较,而不是字符比较

因此,您可以使用INPUTN()函数将日期字符串转换为SAS日期(自1960年1月1日起的天数),然后比较这些日期。下面是一个示例,从代码开始:

%macro mymacro(dt1,dt2);
  %local c_mth1 c_mth2 n_mth1 n_mth2;

  %let c_mth1 = %sysfunc(intnx(month,&dt1.d,-1,e),date9.) ;
  %let c_mth2 = %sysfunc(intnx(month,&dt2.d,-1,e),date9.) ;
  %let n_mth1 = %sysfunc(inputn(&c_mth1,date9.)) ;
  %let n_mth2 = %sysfunc(inputn(&c_mth2,date9.)) ;

  %put &c_mth1 -- &n_mth1;
  %put &c_mth2 -- &n_mth2;

  %if &n_mth1<&n_mth2 %then %put &c_mth1 is before &c_mth2;
  %else %put &c_mth1 is NOT before &c_mth2;

%mend;

--Q.

如果您的宏变量解析为日期文字,您可以使用
intck
%eval
组合来比较它们,例如

%let mvar1 = '01jan2015'd;
%let mvar2 = '01feb2015'd;

/*Prints 1 if mvar2 > mvar1*/
%put %eval(%sysfunc(intck(day,&mvar1,&mvar2)) > 0);

如何比较两个类似日期的宏变量?i、 如果一个在另一个之后,那取决于他们的长相。我会在答案中举个例子。
%let mvar1 = '01jan2015'd;
%let mvar2 = '01feb2015'd;

/*Prints 1 if mvar2 > mvar1*/
%put %eval(%sysfunc(intck(day,&mvar1,&mvar2)) > 0);