2016-05-02 15 views
0
%let enddt = intnx('month',today(),0); 
%let data = DataName_%sysfunc(intnx(month,%sysfunc(date()),-1),yymmn6); 
%let intdt = intnx('month',today(),-7); 
%let start = intnx('month',today(),-25); 

Wie kann ich die anderen 3 Makrovariablen schreibe basierend auf dem ersten (enddt) Zum Beispiel Ab heute intdt = enddt-7, start = enddt-25. Daten = DataName_201604.SAS, Datum Manipulation

Wenn ich das Ende in intnt ('Monat', heute(), - 1) ändere, werden die anderen drei automatisch geändert. intdt = enddt-7, start = enddt-25. Daten = DataName_201603.

Nun, wenn ich das Datum zurück zu 2 Monate will, muss ich es wie dies manuell zu tun:

%let enddt = intnx('month',today(),-2); 
%let data = DataName_%sysfunc(intnx(month,%sysfunc(date()),-3),yymmn6); 
%let intdt = intnx('month',today(),-9); 
%let start = intnx('month',today(),-27); 

Antwort

0

Wenn ich Sie richtig verstehe, Sie über einen Datumsbereich mit 4 Variablen Schleife wollen feste Zeitabstände voneinander entfernt. Sie müssen eine Makro-Funktion erstellen, die die vier Variablen jede Iteration neu definiert, so etwas wie dies sollte man auf dem richtigen Weg:

%macro dateloop(); 
    %do i=0 %to 10; 
     %let enddt = %sysfunc(intnx(month,%sysfunc(date()),-&i),yymmn6); 
     %let data = DataName_%sysfunc(intnx(month,%sysfunc(date()),-&i-1),yymmn6); 
     %let intdt = %sysfunc(intnx(month,%sysfunc(date()),-&i-7),yymmn6); 
     %let start = %sysfunc(intnx(month,%sysfunc(date()),-&i-25),yymmn6); 

     %put enddt = &enddt, data = &data, intdt = &intdt, start = &start; 

     /**** do your work here ****/ 

    %end; 
%mend; 

%dateloop(); 
+0

Diese völlig irrelevant für die Frage gestellt wird, ist. Er versucht nicht, Makrovariablen zu durchlaufen, er versucht, eine als eine Funktion anderer zu schreiben. – superfluous

0

Ihr Problem ist, dass Sie nicht intdt Einstellung und beginnen etwas zu tun haben mit Endedt. Ersetzen Sie "today()" durch "& enddt".

Zum Beispiel:

%let intdt = intnx('month',&enddt.,-7);