SAS 宏循环遍历多个 'yyyy-mm-dd' 带单引号的日期格式
SAS Macro looping through multiple 'yyyy-mm-dd' date format with single quotes
我需要在 SAS 宏中遍历某些日期格式,例如 'yyyy-mm-dd',因为我的主要查询主体使用 Teradata SQL Pass-Thru 但是我下面的代码在 %let [=26 处不起作用=] 没有选择 '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,问题就会得到解决。
你的 %SCAN() 函数调用是错误的。
75 %let list = '2020-03-11' '2020-03-18';
76 %put %qscan(&list,1);
'2020
由于您没有告诉 %SCAN() 使用什么分隔符,因此它使用了任何默认的分隔符集,其中包括连字符。
尝试告诉它只能使用 space 作为分隔符。
%do i=1 %to %sysfunc(countw(&first_dt_list, %str( )));
%let wk_first_dt = %scan(&first_dt_list, &i,%str( ));
我需要在 SAS 宏中遍历某些日期格式,例如 'yyyy-mm-dd',因为我的主要查询主体使用 Teradata SQL Pass-Thru 但是我下面的代码在 %let [=26 处不起作用=] 没有选择 '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,问题就会得到解决。
你的 %SCAN() 函数调用是错误的。
75 %let list = '2020-03-11' '2020-03-18';
76 %put %qscan(&list,1);
'2020
由于您没有告诉 %SCAN() 使用什么分隔符,因此它使用了任何默认的分隔符集,其中包括连字符。
尝试告诉它只能使用 space 作为分隔符。
%do i=1 %to %sysfunc(countw(&first_dt_list, %str( )));
%let wk_first_dt = %scan(&first_dt_list, &i,%str( ));