2016-12-14 5 views
0

Ich bin mit dieser Komprimierungsfunktion in dem Code unten, dass ich versuche zu konvertieren.SAS Datum Makro und komprimieren Funktion

Alter Code: (Dieser Code funktioniert und gibt die folgenden Ergebnisse)

data _null_; 
%let startdt='2015/11/1'; 
date_num=compress(&startdt,"'"); 
call symputx('date_num',date_num); 
%put &startdt; 
%put &date_num; 
run; 

Dieser Code gibt Werte für den Makrovariable STARTDT als 2015.11.01 und datenum- als 2015.11.01.

Ich versuche, ähnliche Funktionalität mit Makrovariablen für Daten zu erreichen.

Neuer Code: (Dieser Code ist mir ein Fehler und ich bin nicht in der Lage, um herauszufinden, warum)

data _null_; 
dt = date(); 
last_mth_beg = intnx('month',dt,-1,'beginning'); 
call symput('startdt',put(last_mth_beg,YYMMDDS10.)); 
date_num=compress(&startdt,"'"); 
call symputx('date_num',date_num); 
%put &startdt; 
%put &date_num; 
run; 

ich eine Störung erhalte, wenn ich diesen neuen Code ausführen. Ich möchte Ergebnisse wie im alten Code erhalten. Bitte helfen. Vielen Dank!

+0

Bewegen Sie '% LET' und '% PUT'-Anweisungen entweder vor oder nach dem Datenschritt, da SAS sie dann auswertet, erleichtert dies das Lesen und Verstehen Ihres Codes. Wenn Sie sie in der Mitte des Datenschritts belassen, sieht es so aus, als ob sie ausgewertet werden, während der Datenschritt ausgeführt wird, was nicht der Fall ist. Behebt das dein Problem? – Tom

+0

Hallo, das löst das Problem nicht. Der Fehler liegt im "neuen Code", der keine let-Anweisung enthält. Vielen Dank! – PJay

+0

Ihr zweiter Datenschritt sollte ebenfalls gut laufen, aber Sie müssen die '% PUT'-Anweisungen nach der' run; '-Anweisung verschieben.Andernfalls werden sie einen Fehler erzeugen, dass die Makrovariablen nicht existieren, oder, was noch schlimmer ist, sie zeigen die Werte, die sie hatten, BEVOR der Datenschritt lief. – Tom

Antwort

0

Ihr erster Datenschritt entfernt nur die Anführungszeichen aus Ihrer Makrovariablen. Sie können dies im Makrocode tun, indem Sie %sysfunc() verwenden, um die compress()-Funktion aufzurufen. Oder benutzen Sie einfach die %scan() Funktion.

%let date_num = %scan(&startdt,1,%str(%')); 

In der zweiten sieht es so aus, als ob Sie versuchen, die INTNX() - Funktion für den Datumswert zu verwenden. Aber Ihre Makrovariablen enthalten keine Datumswerte. Wenn Sie "2015/11/1" so behandeln möchten, als wäre es ein Datum, dann müssen Sie eine Eingabefunktion verwenden, um es zuerst zu konvertieren.

%let last_mth_beg = %sysfunc(intnx(month,%sysfunc(inputn(&date_num,yymmdd10)),-1,b),yymmdd10); 
+0

Ich habe den alten Code nur als Referenz hinzugefügt, da dies das Ergebnis ist, das ich durch Vermeiden der harten Codierung von Daten erreichen möchte. Ich habe versucht, die obige Aussage zu verwenden, aber ich bekomme jetzt einen fehlenden Wert. Vielen Dank! – PJay

+0

Code funktioniert gut. Es nimmt an, dass Ihre Makrovariable STARTDT ein Gültigkeitsdatum im YYYY/MM/DD-Format mit einfachen Anführungszeichen hat. Es wird die neue Makrovariable LAST_MTH_BEG im YYYY/MM/DD-Format generieren, jedoch ohne die einzelnen Anführungszeichen. – Tom

0

Ich bin mir nicht sicher, warum Ihr alter Code Ihnen keinen Fehler gibt. Beim ersten Start sollte der Fehler

angezeigt werden. WARNUNG: Scheinbare symbolische Referenz DATE_NUM nicht aufgelöst.

Dann, nachdem der Datenschritt ausgeführt wurde, hat &DATE_NUM einen Wert. In einem Datenschritt können Sie %PUT nicht verwenden, um eine Makrovariable anzuzeigen, die Sie innerhalb des Datenschritts erstellen.

In Ihrem zweiten Satz von Code hat der Wert der STARTDT Makrovariable, die Sie erstellen, an erster Stelle keine einfachen Anführungszeichen. Wenn Sie nur die folgende ausführen, erhalten Sie das richtige Ergebnis erhalten:

data _null_; 
dt = date(); 
last_mth_beg = intnx('month',dt,-1,'beginning'); 
call symput('startdt',put(last_mth_beg,YYMMDDS10.)); 
run; 

%put &startdt; 

Wenn ich es laufen, ich sehe

2016/11/01