Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在SAS中,如何迭代两个日期,然后将它们作为外部循环插入到sql语句中?_Loops_Macros_Sas - Fatal编程技术网

Loops 在SAS中,如何迭代两个日期,然后将它们作为外部循环插入到sql语句中?

Loops 在SAS中,如何迭代两个日期,然后将它们作为外部循环插入到sql语句中?,loops,macros,sas,Loops,Macros,Sas,我希望外部循环迭代日期。 内部循环经过不同的位置,然后随着位置循环的结束,然后是日期循环进行迭代。定位的内部循环工作正常 我想知道where语句要说的那句话 “t1.Date在'Date'和'date1'之间”如何创建该宏?Date和date1必须同时迭代,以便始终彼此相隔两天 PROC SQL; CREATE TABLE WORK.Report_dates&i AS /* every time the date changes/newtable*/ SELECT t1.Repor

我希望外部循环迭代日期。 内部循环经过不同的位置,然后随着位置循环的结束,然后是日期循环进行迭代。定位的内部循环工作正常

我想知道where语句要说的那句话

“t1.Date在'Date'和'date1'之间”如何创建该宏?Date和date1必须同时迭代,以便始终彼此相隔两天

PROC SQL;
   CREATE TABLE WORK.Report_dates&i AS /* every time the date changes/newtable*/
SELECT t1.ReportsID,
          t1.Type,
          t1.buys,
          t1.sells,
          t1.Age
          FROM work.candy as t1    
where (t1.Date BETWEEN '14Feb2016:0:0:0'dt AND '16Feb2016:0:0:0'dt) AND 
           (t1.Location = "SouthFlorida");
QUIT;


data list_of_dates;
format date date9.;
do Date = '01JUL2016'd to today();
output;
end;
run;

data list_of_dates1;
format date date9.;
do Date1 = '02JUL2016'd to today();
output;
end;
run;
测试时,这两个回路分别工作。但是,当我在一起时,我一直在得到一个sas错误,这是因为“当前正在处理的引用字符串已经超过262个字符,您可能有不平衡的引号。但是我没有任何不平衡的引号,就像我说他们在测试时分开工作,但不在一起

%macro queryLoop(startDate=, i=);

%macro loop(listA, listB);

%let p = %sysfunc(countw(&FACLNBR, %str( )));
%do i=1 %to &p;
    %let lista = %scan(&olista, &i, %str( ));
    %let listb = %scan(&olistb, &i, %str( ));


PROC SQL;
   CREATE TABLE WORK.Report_dates&i AS /* every time the date changes/newtable*/
SELECT t1.ReportsID,
          t1.Type,
          t1.buys,
          t1.sells,
          t1.Age
          FROM work.candy as t1    
where (datepart(t1.Date) BETWEEN &startDate AND &startDate+2 ) AND 
           (t1.Location = &list);
QUIT;

%end;
%mend; 

%loop(listA_1 listA_2, listB_1 listB_2);

%mend queryLoop;

data list_of_dates;
i=1;
format date date9.;
do Date = '01NOV2015'd to '01JAN2016'd;
string = catt('%queryLoop(startDate=', date, ', i=', i, ');');
call execute(string);
i+1;
output;
end;
run;

;*';*";*/;quit;run;

我认为这就是你所寻找的,基于你之前的问题,这个问题和一个有根据的猜测。你需要首先将查询包装在一个宏中,然后在创建日期时,你可以直接使用call Execute将这些日期传递给宏

请参阅下面的代码。请注意,我注释掉了调用execute,因为我显然无法运行代码

%macro queryLoop(startDate=, i=);
PROC SQL;
   CREATE TABLE WORK.Report_dates&i AS /* every time the date changes/newtable*/
SELECT t1.ReportsID,
          t1.Type,
          t1.buys,
          t1.sells,
          t1.Age
          FROM work.candy as t1    
where (datepart(t1.Date) BETWEEN &startDate AND &startDate+2 ) AND 
           (t1.Location = "SouthFlorida");
QUIT;
%mend queryLoop;

data list_of_dates;
i=1;
format date date9.;
do Date = '01JUL2016'd to today();
string = catt('%queryLoop(startDate', date, ', i=', i, ');');
*call execute(string);
I+1;
output;
end;
run;

我不确定我是否理解这个问题。但是如果你要求DATE1在DATE之后两天,那么就这样做吧。
DATE1=DATE+2;
为什么你要在有datetime变量的情况下创建日期?因为你的查询没有聚合,我怀疑一个带有do循环和output语句的数据集会获得相同的结果。基本上你是将数据分组为三天的间隔,每条记录都需要在间隔内。不确定为什么要这样做,或者直接使用多标签格式或SQL查询无法更有效地解决此问题。似乎传递到开始日期的是第三列字符串中的数字,所以是startDate=20636数据库无法识别该格式。如何从第二列传入日期格式。您运行了吗?这就是SAS存储日期的方式,因此更改格式只会更改外观,而不会影响实际数据。您是对的,确实有效,错误会不断出现。我在下面的主要问题中发布了有关错误的更多信息或者我得到了。我应该发布一个新问题,还是像我那样附加在这里?我不知道TBH。如果是您的问题,请在打开MPRINT和SYMBOLGEN选项的情况下运行宏,以便您可以看到哪些代码正在传递给SAS。
options MPRINT SYMBOLGEN;
您可以在communities.SAS.com上发布,以获得一个限制较少的论坛。