2017-01-04 25 views
0

私は変数date = 201611を持っており、翌月の最初の日を '2016-12-01'の形式で作成する必要があります。つまり、私は月に12のために働いてコードを作るために、いくつかの改善を追加する必要がSAS - 条件付きマクロ変数

%let date = 201611; 
%let rok = %sysfunc(substr(&date,1,4)); 
%let month = %sysfunc(substr(&date,5,2)); 
%let xdat2_ii = &rok-%eval(&month + 1)-01; 
%let xdat1 = %str(%')&xdat2_ii.%str(%'); 
%put &xdat1; 
'2016-12-01' 

日付が201612であるときに取得するために「2017年1月1日:次のコードは、最大11までの数ヶ月のために正常に動作します'

私の考えは、マクロを使用してそれを行うことでしたが、動作しません。

%macro promenne; 
%if &month < 12 %then %let xdat2_ii = &rok-%eval(&month + 1)-01 
%else %if &month= 12 %then %let xdat2_ii = %eval(&rok + 1)-01-01; 
%mend promenne; 

ご利用いただきありがとうございます。

答えて

2

日付を扱う場合、組み込みの日付シフト機能(この場合はintnx)を使用するのが最も簡単です。

/* define variable (this is a macro STRING) */ 
%let date=201612; 

/* convert to SAS date value (numeric, num of days since 01JAN1960) */ 
%let dateval=%sysfunc(mdy(%substr(&date,5,2),1,%substr(&date,1,4))); 

/* finally - shift to beginning of following month and format output */ 
%let xdat2_ii=%sysfunc(intnx(MONTH,&dateval,1,B),yymmddd10.); 

%put &xdat2_ii; /* 2017-01-01 */ 
+0

ありがとう、それは素晴らしい作品です! –