使用sas宏的日期差异

时间:2017-09-09 11:49:58

标签: sas

I have two macro variables value.

 a=20150501
 b=20160530

我想创建一个新的宏变量,它将显示a和b之间的月数。

3 个答案:

答案 0 :(得分:2)

与Allan的响应相同的逻辑,但使用数据步骤来简化代码......

%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的文档,了解以月计算差异的其他方法。

答案 1 :(得分: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 :(得分:0)

您可以使用intck()功能获取月数差异。

如果您正在执行年龄或任期等计算,请务必使用intck()的'连续'参数。

如果您只是需要知道31-May和01-Jun之间有1个月的差异,那么请使用'discrete'(默认)参数。

%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