SAS SQL宏增量日期范围

时间:2016-03-01 12:21:16

标签: sas sas-macro

我目前无法使用递增数据范围输出一个表,该表使用填充了已使用VBA重命名的JobOffers的电子邮件的表 - 这对我自己的学习来说比其他任何东西更多。

我希望代码循环遍历我可以在宏命令中设置的日子

%EmailDump('01Jan2015'd,'02Jan2015')

它将在下面的代码中运行宏,并允许我从该时段内撤回所有电子邮件并将其导出(我知道我每次都在写表 - 但是这将被导出(每次导出应该是不同,因为它内有EmailStart的宏)

因此,一些虚拟数据看起来像

主题EmailStartDate

工作机会12/01/2015

工作机会25/01/2015

招聘信息12/05/2015

使用的代码如下

%Macro EmailDump(begindate,endindate);

%do
EmailStart = &begindate.
%to &endindate.
%by 1;

%end;

PROC SQL;

CREATE TABLE WORK.EMAILDUMP AS

SELECT * FROM WORK.EMAILS

WHERE TOPIC = 'JobOffer'

and EmailStartDate = &EmailStart 

;QUIT;

proc export data=work.EMAILDUMP

 dbms=XLSX

 outfile="/p01/Output File &EmailStart " replace;

run;

%Mend EmailDump;

%EmailDump('01Jan2015'd,'02Jan2015'd);

错误消息如下所示

错误:在%EVAL函数或%IF条件中找到了一个字符操作数,其中需要一个数字操作数。条件是:        &安培; BEGINDATE。 错误:%DO EmailStart循环的%FROM值无效。 错误:在%EVAL函数或%IF条件中找到了一个字符操作数,其中需要一个数字操作数。条件是:        &安培; endindate。 错误:%DO EmailStart循环的%TO值无效。 错误:宏EmailDump将停止执行

不确定是否有人可以帮我这个?非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

以下是您的代码简化,以包含重现问题所需的内容:

%macro emaildump(begindate,endindate);
  %do emailstart = &begindate %to &endindate;
    %put &emailstart;
  %end;
%mend emaildump;

如果我们用文字称呼它,我们会得到你描述的信息:

%emaildump('01jan2015'd,'02jan2015'd);

给出:

ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric
       operand is required. The condition was: &begindate
ERROR: The %FROM value of the %DO EMAILSTART loop is invalid.
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric
       operand is required. The condition was: &endindate
ERROR: The %TO value of the %DO EMAILSTART loop is invalid.
ERROR: The macro EMAILDUMP will stop executing.

但是,如果我们传入原始日期值(它们只是表示为整数),它可以正常工作。我们可以使用mdy()函数计算原始日期值。因为我们是用宏语言进行的,所以我们需要用mdy()包裹%sysfunc()

%let start = %sysfunc(mdy(1,1,2015));
%let end   = %sysfunc(mdy(1,2,2015));
%emaildump(&start,&end);

提供所需的输出:

20089
20090

或者,您也可以使用%sysevalf()来评估文字并将其转换为如下数字:

%let start = %sysevalf('01Jan2015'd);
%let end   = %sysevalf('02Jan2015'd);
%emaildump(&start,&end);

正如昆汀在下面的评论中指出的......发生这种情况的原因是:

  

这是%DO语句隐式调用%EVAL%EVAL无法调用的事实的限制   处理日期文字。