SAS SQL 宏增量日期范围

SAS SQL Macro Incremental Date Range

我目前在使用递增数据范围输出 table 时遇到问题,该 table 使用 table 填充电子邮件,其中包含已使用 VBA 重命名的 JobOffers - 这是更多的是为了自己的学习。

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

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

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

所以一些虚拟数据看起来像

主题电子邮件开始日期

工作机会 12/01/2015

工作机会 25/01/2015

工作机会 2015 年 12 月 5 日

使用的代码如下

%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 条件中找到字符操作数。条件是: &开始。 错误:%DO EmailStart 循环的 %FROM 值无效。 错误:在需要数字操作数的 %EVAL 函数或 %IF 条件中找到字符操作数。条件是: &结束。 错误:%DO EmailStart 循环的 %TO 值无效。 错误:宏 EmailDump 将停止执行


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

下面是您的代码简化后仅包含重现问题所需的代码:

%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() 函数计算原始日期值。因为我们是用宏语言做的,所以我们需要用 %sysfunc():

包装 mdy()
%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);

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

it's a limitation of the fact that %DO statement implicitly calls %EVAL, and %EVAL can't handle date literals.