2016-10-31 4 views
0

Dies ist wahrscheinlich eine einfache Frage, aber ich habe noch nicht gelungen, es herauszufinden.SAS Where-Klausel mit Makrovariablen

Ich muss einige Daten aus einem SAS-Dataset abrufen, wobei das DATE in einen 6-Monats-Bereich fällt (z. B. 01JAN2017 bis 30JUN2017) Ich habe versucht, den folgenden Code auszuführen, aber es führt zu einem Fehler. Irgendwelche Gedanken? Ich bin sicher, das ist etwas einfach ...

%let start1 = %Sysfunc(InputN(01JAN2017 , Date9.)) ; 
%let start2 = %sysfunc(putN(&start1, date9)); 
%put start1 &start1 start2 &start2; 

%let end1 = %sysfunc(inputn(30JUN2017,Date9.)); 
%let end2 = %sysfunc(putN(&end1, date9)); 
%put end1 &end1 end2 &end2; 

proc print data=ext.account_detail (obs = 10); 
    where manufacturer = 'FORD' or product_segment = 'CHRYSLER' 
     and manufacturer_date between &start2 and &end2; 
run; 

Das Ergebnis ist der folgende Fehler: HINWEIS: Zeile durch die Makrovariable erzeugt „START2“.

26   01JAN2017 
       _______ 
       22 
       76 
ERROR: Syntax error while parsing WHERE clause. 
ERROR 22-322: Syntax error, expecting one of the following: !!, *, **, +, -, /, AND, ||. 
ERROR 76-322: Syntax error, statement will be ignored. 

Antwort

1

Sie haben die Zeichenfolge 01JAN2017 in die Makrovariable START2 eingefügt und dann versucht, sie in einer WHERE-Anweisung zu verwenden, ohne sie zuvor in einen tatsächlichen Datumswert zu konvertieren.

Wenn Sie Ihre Makrovariablen auf diese Weise formatiert werden, dann verwenden Datumsliteral Syntax in Ihrer WHERE-Anweisung.

where manufacturer = 'FORD' or product_segment = 'CHRYSLER' 
    and manufacturer_date between "&start2"D and "&end2"D 
; 
0

geht diese in eine andere Richtung vollständig, aber die intnx Funktion ist für diese Aufgabe gut geeignet. Es ermöglicht Ihnen, die Zeit um Intervalle Ihrer Wahl zu erhöhen. Die Syntax lautet intnx('interval', fromdate, num_periods, 'alignment').

Einige Beispiele:

intnx('month', '20FEB17'd, 0, 'beg') will return 01FEB2017

intnx('month', '20FEB17'd, 2, 'end') will return 30APR2017

intnx('month', '20FEB17'd, -1, 'beg') will return 01JAN2017

Im ersten Fall, lesen SAS 20FEB17 als Eingabe verlagerte er Null Monate und gibt den Beginn dieses Zeitraums . Im zweiten Beispiel verschiebt es unser Eingabedatum um zwei Monate und gibt das Ende dieses Zeitraums zurück. Im letzten Beispiel sehen wir, dass wir in der Lage sind, sich zeitlich rückwärts zu bewegen, einen Monat vor unserem Eingabedatum. In Ihrem speziellen Fall würden Sie etwas wie ... manufacturer_date between '01JAN17'd and intnx('month', '01JAN17'd, 5, 'end') schreiben.

Hinweis, der etwas Gegen intuitiv, wir nur auf fünf Monate verschieben, müssen ein sechsmonatiges Fenster zu erfassen. Dies liegt daran, dass die Ausrichtung "Ende" uns den letzten Monat gibt. Anders ausgedrückt, JAN -> FEB -> MAR -> APR -> MAI -> JUN erfordert 5 Schritte. Beachten Sie auch, dass ich nur Beispiele mit monatlichen Verschiebungen angegeben habe. SAS ermöglicht auch jährlich Verschiebungen, halb Jahr verschiebt, und Sie können sogar ein benutzerdefiniertes Intervall bei Bedarf programmieren.

Verwandte Themen