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.
我目前在使用递增数据范围输出 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.