SAS 宏循环使用单引号的多个“yyyy-mm-dd”日期格式

Posted

技术标签:

【中文标题】SAS 宏循环使用单引号的多个“yyyy-mm-dd”日期格式【英文标题】:SAS Macro looping through multiple 'yyyy-mm-dd' date format with single quotes 【发布时间】:2021-09-24 04:09:26 【问题描述】:

我需要在 SAS 宏中循环某些日期格式,例如“yyyy-mm-dd”,因为我的主要查询主体使用 Teradata SQL Pass-Thru,但是我下面的代码在 %let wk_first_dt 没有获取 'yyyy 的情况下不起作用-mm-dd' 格式。错误说

%MACRO DO_APPEND;
%let first_dt_list = '2020-03-11' '2020-03-18';
%local i wk_first_dt;
%do i=1 %to %sysfunc(countw(&first_dt_list));
%let wk_first_dt = %scan(&first_dt_list, &i);

...
proc sql
...

where BILL_DT >= Date &wk_first_dt
AND SL_INVC.BILL_DT <= (Date &wk_first_dt + 7)
...
quit;


...

%END;
%MEND; 
%DO_APPEND;
ERROR: Literal contains unmatched quote.
ERROR: The macro DO_APPEND will stop executing.

做了很多研究,我认为问题是由于这种格式的单引号“yyyy-mm-dd”,因为在 SAS 宏中对单引号进行了特殊处理。然而,最受欢迎的建议像

%let first_dt_list = %str(%')yyyy-mm-dd.%str(%') 

在我的情况下不起作用。请指出我正确的方向。提前致谢!

顺便说一句,在上面的代码中,如果我将 %scan(&first_dt_list, &i) 更改为 '2020-03-11',整个宏都可以工作 - 但我只需要循环多个日期。这让我相信一旦将 'yyyy-mm-dd' 传递给 %let wk_first_dt,问题就会得到解决。

【问题讨论】:

您是否打开了 MPRINT 选项,以便在 LOG 中看到您的宏正在生成的 SAS 代码? 【参考方案1】:

您的 %SCAN() 函数调用错误。

75    %let list = '2020-03-11' '2020-03-18';
76    %put %qscan(&list,1);
'2020

由于您没有告诉 %SCAN() 使用哪个分隔符,它使用了任何默认分隔符集,包括连字符。​​

试着告诉它只能使用空格作为分隔符。

%do i=1 %to %sysfunc(countw(&first_dt_list, %str( )));
%let wk_first_dt = %scan(&first_dt_list, &i,%str( ));

【讨论】:

以上是关于SAS 宏循环使用单引号的多个“yyyy-mm-dd”日期格式的主要内容,如果未能解决你的问题,请参考以下文章

在宏内部使用变量内部数据集名称时,SAS语法错误22和200

伪代码转换为SAS宏代码

SAS:使用宏格式化多个proc频率

sas怎么定义一个宏变量求n项和

#SAS#月份循环

SAS:包括输出中的宏参考? [重复]