2017-04-07 25 views
1

2つの日付、開始日と終了日が与えられています。SAS開始日と終了日が与えられた最初の35日後に各30日間の日付を知る必要があります

私は最初の35日間の日付を知りたいと思っています。その後、それぞれ30日間の期間を知りたいと思います。

私は持っています。

start  end 
22-Jun-15 22-Oct-15 
9-Jan-15 15-May-15 

希望します。

start  end   tik1  tik2  tik3  tik4 
22-Jun-15 22-Oct-15 27-Jul-15 26-Aug-15 25-Sep-15 
9-Jan-15 15-May-15 13-Feb-15 15-Mar-15 14-Apr-15 14-May-15 

私は日付の計算に問題はありませんが、実際の問題は変数を作成して名前を増やすことです。その文脈で説明する方が簡単かもしれないと思ったので、私はすべての問題を含めることに決めました。

+0

問題へのあなたの現在のアプローチは何ですか? –

+0

ループの変数名をインクリメントするカラムの値を取得するためのマクロを持つこともできます。変数を持つ一時テーブルを作成してください....以前のテーブルとマージする –

+0

本当に広い出力をしたいですかフォーマット?あるいは、細長いフォーマットも動作します。つまり、各期間ごとに1つのレコードを生成します。 – Quentin

答えて

2

次のロジックを経由して問題を解決することができます:列の

1)の決定数が追加されます。

2)の要件

data test; 
input start end; 
informat start date9. end date9.; 
format start date9. end date9.; 
datalines; 
22-Jun-15 22-Oct-15 
09-Jan-15 15-May-15 
; 
run; 

/*******Determining number of columns*******/ 
data noc_cal; 
set test; 
no_of_col = floor((end-start)/30); 
run; 
proc sql; 
select max(no_of_col) into: number_of_columns from noc_cal; 
run; 

/*******Making an array where 1st iteration(tik1) is increased by 35days whereas others are incremented by 30days*******/ 
data test1; 
set test; 
array tik tik1-tik%sysfunc(COMPRESS(&number_of_columns.)); 
format tik: date9.; 
tik1 = intnx('DAYS',START,35); 
do i= 2 to %sysfunc(COMPRESS(&number_of_columns.)); 
tik[i]= intnx('DAYS',tik[i-1],30); 
if tik[i] > end then tik[i]=.; 
end; 
drop i; 
run; 

代替方法(あなたがPROCのSQLを使用したくない包み)

data test; 
input start end; 
informat start date9. end date9.; 
format start date9. end date9.; 
datalines; 
22-Jun-15 22-Oct-15 
09-Jan-15 15-May-15 
; 
run; 

/*******Determining number of columns*******/ 
data noc_cal; 
set test; 
no_of_col = floor((end-start)/30); 
run; 

proc sort data=noc_cal; 
by no_of_col; 
run; 

data _null_; 
set noc_cal; 
by no_of_col; 
if last.no_of_col; 
call symputx('number_of_columns',no_of_col); 
run; 

/*******Making an array where 1st iteration(tik1) is increased by 35days whereas others are incremented by 30days*******/ 
data test1; 
set test; 
array tik tik1-tik%sysfunc(COMPRESS(&number_of_columns.)); 
format tik: date9.; 
tik1 = intnx('DAYS',START,35); 
do i= 2 to %sysfunc(COMPRESS(&number_of_columns.)); 
tik[i]= intnx('DAYS',tik[i-1],30); 
if tik[i] > end then tik[i]=.; 
end; 
drop i; 
run; 

マイ出力列ごとの値を計算する:

> **start |end  |tik1  | tik2  |tik3  |tik4** 
> 22Jun2015 |22Oct2015 |27Jul2015| 26Aug2015|25Sep2015|  
> 09Jan2015 |15May2015 |13Feb2015| 15Mar2015|14Apr2015|14May2015 
+0

私はこれを消化するのにもっと時間が必要です!出力は必要に応じて、私はprocのSQL​​を使用しないことを好むが、再びこの場合の簡潔さを理解することができます。私は確かにこれを通って私の心を拡大します。ありがとう! – heroz

+0

@heroz proc sqlを使いたくない場合は、代わりにそれを追加しました。コードの詳細な説明が必要な場合はお知らせください。また、私の答えがあなたの質問を解決するのを助けた場合、リンクを訪問してください:http://stackoverflow.com/help/someone-answers –

+0

それは素晴らしい、詳細な説明は非常に役立つだろう。私が最も興味を持っているコードは、%sysfuncを使用して変数名をインクリメントする最後のセクションです。これを完了するためにコードに入ります。 – heroz

0

私は長い垂直構造を好む傾向があります。私はそれに近づく:

data want; 
    set have; 
    tik=start+35; 
    do while(tik<=end); 
    output; 
    tik=tik+30; 
    end; 
    format tik mmddyy10.; 
run; 

本当にそれが必要な場合は、そのデータセットを2番目のステップで転記することができます。

+0

私はそれをこのように考えなかったでしょうが、これはまっすぐに見えるので、それは確かに探検の価値があります。ワイドは、この情報が使用されている方法のために好みです、私は転置を検討します - 私はいつも学んでいます。これを提供してくれてありがとう! – heroz

+0

私はこれを有用なものとしてマークしたいと思いますが、私は低い担当者を持っているのでできません。 – heroz

関連する問題