2016-10-31 12 views
0

これはおそらく簡単な質問ですが、私はまだそれを理解することができませんでした。SAS句マクロ変数で

DATEが6ヵ月の範囲内にあるSASデータセットからデータを取得する必要があります(例:01JAN2017から30JUN2017)。次のコードを実行しようとしましたが、エラーが発生しました。何かご意見は? 注:ラインマクロ変数「START2」によって生成された私は、これは単純なものである...

%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; 

結果が次のエラーであると確信しています。

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. 

答えて

1

文字列01JAN2017をマクロ変数START2に挿入し、最初に実際の日付値に変換せずにWHERE文で試してみました。

マクロ変数をそのようにフォーマットするには、WHERE文で日付リテラル構文を使用します。

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

これは完全に別の方向に向いていますが、intnxの機能がこのタスクに適しています。それはあなたが選択した間隔で時間を増やすことができます。構文はintnx('interval', fromdate, num_periods, 'alignment')です。

いくつかの例:最初のケースで

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

、SASは、入力として20FEB17を読み取るゼロヶ月、それをシフトし、その期間の始まりを返します。 2番目の例では、入力日付を2ヶ月先にシフトし、その期間の終わりを返します。最後の例では、入力日付の1ヶ月前に、時間の後ろにシフトすることができることがわかります。

具体的には、 manufacturer_date between '01JAN17'd and intnx('month', '01JAN17'd, 5, 'end')のようなものを入力します。

6ヶ月のウィンドウをキャプチャするには、やや直感的に、我々は5ヶ月先にシフトする必要があることに注意してください。これは、 'end'アラインメントが私たちに最後の月を与えるからです。別の言い方をすれば、JAN→FEB→MAR→APR→MAY→JUNの5ステップが必要です。また、私は毎月のシフトを伴う例しか与えていないことにも注意してください。 SASはまた、毎年のシフト、半年のシフトが可能で、必要に応じてカスタムインターバルをプログラムすることもできます。

関連する問題