2017-09-09 76 views
0
I have two macro variables value. 

a=20150501 
b=20160530 

我想創建一個新的宏變量,它將顯示a和b之間的月數。使用sas宏的日期差異

+0

那你試試?你做了什麼將你在宏變量中的字符串轉換爲實際的SAS日期值? – Tom

+2

你怎麼定義'月'?如果日期是2月29日,下一個日期是3月1日,預期的答案是什麼?一個月不是一個時間的衡量標準,如周或日。 – Reeza

回答

1

可以使用INTCK函數,該函數 - 看documentation

%let a=20150501; 
%let b=20160530; 

/** 
* first - convert to date values 
* (DATE_A=01MAY2015 DATE_B=30MAY2016) 
*/ 
%let date_a=%sysfunc(putn(%sysfunc(
     INPUTN(%sysfunc(PUTN(&a, Z8.)), YYMMDD8.) 
    ), date9.)); 
%let date_b=%sysfunc(putn(%sysfunc(
     INPUTN(%sysfunc(PUTN(&b, Z8.)), YYMMDD8.) 
    ), date9.)); 
%put &=date_a &=date_b; 

/** 
* Now calculate difference using INTCK 
* (DIFF=12) 
*/ 
%let diff=%sysfunc(intck(MONTH,"&date_a"d,"&date_b"d)); 
%put &=diff; 
2

相同的邏輯,艾倫的響應,但使用的數據步驟簡化代碼...

%let a = 20150501; 
%let b = 20160530; 

data _null_; 
    a = input(put("&a", 8.), yymmdd8.); 
    b = input(put("&b", 8.), yymmdd8.); 
    diff = intck("month", a, b); 
    call symputx("diff", put(diff, best.)); 
run; 

%put &diff; 

12 

intck見文檔用於計算月份差異的替代方法。

0

您可以使用intck()函數來獲取月差數。

如果您正在執行的計算,如年齡,或任職,則一定要使用的intck()的「連續」參數。

如果你只需要知道,是31月和01月在1個月的差異,然後使用「離散」(默認)參數。

%let a=20150531; 
%let b=20150601; 

* CONVERT TO SAS DATES; 
%let date1 = %sysfunc(inputn(&a,yymmdd8.)); 
%let date2 = %sysfunc(inputn(&b,yymmdd8.)); 

* CALCULATE # DISCRETE MONTHS DIFFERENCE; 
%let discrete_months = %sysfunc(intck(month, &date1, &date2, d)); 
%put &=discrete_months; 

* CALCULATE # CONTINUOUS MONTHS DIFFERENCE;; 
%let cont_months = %sysfunc(intck(month, &date1, &date2, c)); 
%put &=cont_months; 

輸出:

DISCRETE_MONTHS=1 
CONT_MONTHS=0