Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/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
Date 由于数据类型不同,对SAS日期宏的引用不起作用_Date_Macros_Sas - Fatal编程技术网

Date 由于数据类型不同,对SAS日期宏的引用不起作用

Date 由于数据类型不同,对SAS日期宏的引用不起作用,date,macros,sas,Date,Macros,Sas,希望能在这方面有所帮助 目前,该查询使用以下命令为m1-m6和d1-d6创建引用 %let m1=1114; %let d1 ='30NOV2014'd; %let m2=1214; %let d2='31DEC2014'd; %let m3=0115; %let d3='31JAN2015'd; %let m4=0215; %let d4='28FEB2015'd; %let m5=0315; %let d5='31MAR2015'd; %let m6=0415; %let d6='30APR

希望能在这方面有所帮助

目前,该查询使用以下命令为m1-m6和d1-d6创建引用

%let m1=1114;
%let d1 ='30NOV2014'd;
%let m2=1214;
%let d2='31DEC2014'd;
%let m3=0115;
%let d3='31JAN2015'd;
%let m4=0215;
%let d4='28FEB2015'd;
%let m5=0315;
%let d5='31MAR2015'd;
%let m6=0415;
%let d6='30APR2015'd;
根据代码的其余部分,m1-m6日期的格式必须为mmyy。我尝试用以下内容替换上述内容:

data _datemacro_;
m1 = put(intnx('day','01NOV2014'd,0),mmyyn4.);
call symput('m1',"'"||put(m1,9.)) ;
d1 = put(intnx('day','30NOV2014'd,0),date9.);
call symput('d1',"'"||put(d1,9.)) ;

m2 = put(intnx('day',&d1,+1),mmyyn4.);
call symput('m2',"'"||put(m2,9.)) ;
d2 = put(intnx('month',&d1,+1,'e'),date9.);
call symput('d2',"'"||put(d2,9.)||"'"||"d") ;

...etc through m6 and d6

run;
下面是产生各种错误的代码的其余部分,包括

错误22-322:语法错误,应为以下内容之一:名称 带引号的字符串,(,/,;,数据,最后一个,NULL

错误200-322:符号无法识别,将被忽略

我能够让它精确地运行到最后6行,仅运行这6行就产生了78个错误

关于如何编写宏以保持正确的数据类型,同时准确定义月份的开始日期和结束日期,有什么建议吗?当我尝试将每个月的开始日期和结束日期更改为相同的格式时,代码其余部分中的某些内容会导致错误,指出它无法使用两个不同格式的变量,即使在它们显然与代码中定义的格式相同

请让我知道,如果有什么我可以澄清,因为这是一个有点难以解释比我的意图


感谢您的帮助。

请尝试以下方法来创建宏变量:

data _null_;
  START_MTH = '01nov2014'd;
  do i = 1 to 6;
    T_DATE = intnx('month',START_MTH,i)-1; /*Shift forwards i months then back 1 day*/
    call symput(cats('m',i),put(T_DATE,mmyyn4.));
    call symput(cats('d',i),cats("'",put(T_DATE,date9.),"'d"));
  end;
run;

因此,您基本上是在尝试构建一个可以逐月运行报告的宏。我认为使用宏是一个好主意,但您的结构可以从重新组织中受益

首先要修复的是硬编码的日期。硬编码在99%的情况下是不好的。为什么不使用循环呢

在程序顶部初始化开始日期和结束日期。将来,如果它们位于顶部,则很容易找到和更改它们,并且您无需搜索代码来找出还需要更改的内容:

* PICK ANY DATES IN THE MONTHS YOU WANT TO START AND END.  IE. DOESNT MATTER IF YOU CHOOSE THE FIRST OR THE 20TH. IT WILL RUN FOR THAT MONTH;
%let rpt_start = %sysfunc(mdy(11,1,2014));
%let rpt_end   = %sysfunc(mdy( 4,1,2015));
转到并获取开始日期和结束日期之间的数据:

proc sql;
create table perf as

select a. field, a. field, a. field, a. reportingdate, 
        a. field, a. field, 
        e. field, 
        f. field

from table a, table2 e, table3 f

    where a. reportingdate between &rpt_start and &rpt_end
    and (a. field=1 or a. field=1)  
    and a. field = e. field and a. field = f. field;

quit;
现在,在开始日期和结束日期之间每个月循环一次。在进行过程中创建所需的数据集

%macro create_monthly_datasets;
    %local tmp_dt tmp_end rpt_dt;

    %let tmp_end = %sysfunc(intnx(month,&rpt_end,0,end)); *CALC END-DATE DESIRED;

    %let tmp_dt = %sysfunc(intnx(month,&rpt_start,0,beginning)); *INITIALISE LOOP;
    %do %while (&tmp_dt le &tmp_end);

      * CALC ACUTAL DATE WANTED AND STORE IT IN RPT_DT;
      * CALC THE MMYY VAL YOU NEED;
      * PRINT OUT BOTH VALUES TO MAKE SURE THEYRE CORRECT;

      %let rpt_dt = %sysfunc(intnx(month,&tmp_dt,0,end)); 
      %let mmyy   = %sysfunc(month(&rpt_dt),z2.)%substr(%sysfunc(year(&rpt_dt)),3,2);
      %put %sysfunc(sum(&rpt_dt),date9.) &mmyy;  

      * DO THE WORK;
      data m&mmyy (rename=(field=active&mmyy field=co&mmyy field=es&mmyy field=sr&mmyy));
        set perf;
        where datepart(reportingdate)=&rpt_dt;
      run;

      proc sort data=m&mmyy; by field descending co&mmyy; run;
      proc sort data=m&mmyy nodupkey out=m2&mmyy; by field; run;

      %let tmp_dt = %sysfunc(intnx(month,&tmp_dt,1,beginning)); * ITERATE LOOP;
    %end;


%mend;
%create_monthly_datasets;

首先,您试图在宏定义中的data语句中重命名
字段
4次。语法是
oldname1=newname1 oldname2=newname2…
。进一步的问题-为什么要在
proc sql
中的同一个表中多次选择同一字段?是否替换了所有变量名th
字段
?如果是,请区分它们以便于调试。我应该补充的是,该代码未经测试。希望我没有任何语法错误。但你应该了解它的要点。赞成以比我更全面的方式处理代码。
%macro create_monthly_datasets;
    %local tmp_dt tmp_end rpt_dt;

    %let tmp_end = %sysfunc(intnx(month,&rpt_end,0,end)); *CALC END-DATE DESIRED;

    %let tmp_dt = %sysfunc(intnx(month,&rpt_start,0,beginning)); *INITIALISE LOOP;
    %do %while (&tmp_dt le &tmp_end);

      * CALC ACUTAL DATE WANTED AND STORE IT IN RPT_DT;
      * CALC THE MMYY VAL YOU NEED;
      * PRINT OUT BOTH VALUES TO MAKE SURE THEYRE CORRECT;

      %let rpt_dt = %sysfunc(intnx(month,&tmp_dt,0,end)); 
      %let mmyy   = %sysfunc(month(&rpt_dt),z2.)%substr(%sysfunc(year(&rpt_dt)),3,2);
      %put %sysfunc(sum(&rpt_dt),date9.) &mmyy;  

      * DO THE WORK;
      data m&mmyy (rename=(field=active&mmyy field=co&mmyy field=es&mmyy field=sr&mmyy));
        set perf;
        where datepart(reportingdate)=&rpt_dt;
      run;

      proc sort data=m&mmyy; by field descending co&mmyy; run;
      proc sort data=m&mmyy nodupkey out=m2&mmyy; by field; run;

      %let tmp_dt = %sysfunc(intnx(month,&tmp_dt,1,beginning)); * ITERATE LOOP;
    %end;


%mend;
%create_monthly_datasets;