2016-04-14 28 views
1

今日の日付から指定された範囲を含む年、四半期、月の3つのSASテーブルを作成する必要があります。私はそれを行うには、よりスマートな方法があると思いますが、(私は5年前に行く必要がある場合、たとえば)私のようなものになってしまった:SASマクロの日付によるループ、正しいステップを示す方法は?

%macro asd; 

%let today = %sysfunc(today()); 
%let end_year = %sysfunc(intnx(year,&today,-5)); 


proc sql; 
create table years 
(
Years num informat = date9. format = date9. 
); 

insert into years 

%do i = &today. %to &end_year. %by -365; 
%if i = &today.-365 %then %do; 
values(&i.-1) 
%end; 
%else %do; 
values(&i.) 
%end; 
%end; 
; 
quit; 

%mend asd; 
%asd; 
run; 

問題は、私が指示する方法がわからないということです日付期間としてのループの一歩で、正確な数字で終わりました(年は4年毎、月は2ヶ月ごと、四半期は16分ごと)。

私はループを1年間追加して、少なくとも数回のうるう年を試してみましたが、うまくいきません。だから、数ヶ月に進んで、おそらく別のネストされたループを実装する前に、私はそのようなテーブルを作成する簡単な方法があるかどうか尋ねたがっていました。

ありがとうございます! :)

+0

生成したいデータを表示できますか?どのように日付期間を保存するかの例は、あなたが何をしようとしているかを説明するのに役立ちます。日付の範囲を生成したいだけなら、おそらくデータステップでそれを行い、マクロコードとSQ​​Lを避けることができます。 – Tom

答えて

1

ループを年数にわたってループし、代わりにループ内で必要なマクロ変数を計算します。

例 - 非マクロバージョン。

Do I=1 to 5; 
    Year=intnx('year', date, 1); 

     Rest of code; 
End; 
+0

ありがとう!私はループを書き直して、それが動作します:) '%do i = -1%〜-5%-1; 値(%sysfunc(intnx(year、&today、&i))) %; – Kvadich

関連する問題