SAS宏日期不等式

时间:2016-03-16 10:54:13

标签: date sas

早上好,

这是与此类似的问题(link),但我理想地寻找在任何地方都找不到的进一步解释。

最近,一位同事问我,为什么以下不平等会返回他们所做的结果:

%MACRO  TEST ;

%IF '01JAN2009'D    <   '01MAR2015'D    %THEN %PUT  1 is True ;
%ELSE %PUT  1 is False ;

%IF '01FEB2009'D    <   '01MAR2015'D    %THEN %PUT  2 is True ;
%ELSE %PUT  2 is False ;

%IF '01SEP2009'D    <   '01MAR2015'D    %THEN %PUT  3 is True ;
%ELSE %PUT  3 is False ;

%IF '01OCT2009'D    <   '01MAR2015'D    %THEN %PUT  4 is True ;
%ELSE %PUT  4 is False ;

%MEND   TEST ;
%TEST ;

运行TEST返回:

1 is True
2 is True
3 is False
4 is False

我知道%SYSEVALF()需要按预期解决这些不等式。但是,任何人都可以向我解释SAS在这四个实例中做了什么以及为什么两个返回TRUE值,而两个返回FALSE?

2 个答案:

答案 0 :(得分:2)

You can't perform date-literal evaluations directly in SAS MACRO. In your examples above, the evaluations are being performed as character strings, hence '01SEP2009'D < '01MAR2015'D being false as 01S is greater than 01M.

To compare date literals, you need to convert them to the underlying SAS date (i.e. a number).

  %PUT %EVAL(%SYSEVALF('01sep2009'd) < %SYSEVALF('01mar2015'd)) ;
  /* log shows 1 (true) */

答案 1 :(得分:1)

将它们作为字符串进行比较。结果可以解释为JFM之前,SO之后。{/ p>