SAS日期差异

时间:2018-05-04 13:02:06

标签: sas

以下代码有什么问题

%let a='2017-01-01';
%let b='2017-12-01';


%let days = %sysfunc(intck(month,"&a"d,"&b"d));
%put days;

以下是错误

ERROR: Argument 2 to function INTCK referenced by the %SYSFUNC or %QSYSFUNC macro function is not a number.
ERROR: Argument 3 to function INTCK referenced by the %SYSFUNC or %QSYSFUNC macro function is not a number.
ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC argument list.  Execution of %SYSCALL statement or %SYSFUNC 
    or %QSYSFUNC function reference is terminated.
67         %put days;
days

2 个答案:

答案 0 :(得分:1)

三个问题:

  1. 您的日期不是SAS日期文字。 SAS日期文字的格式为'DDMMMYYYY'd'DDMMMYY'd例如,01JAN2018'd01JAN18'd

  2. 您已在声明日期的宏变量周围加上引号,并在调用intck.

  3. 时再次将双引号括在它们周围
  4. &需要加days前缀。

  5. 以下代码解决了这些问题:

    %let a=01JAN2017;
    %let b=01DEC2017;
    
    
    %let months = %sysfunc(intck(month,"&a"d,"&b"d));
    %put &months;
    

    因为您要计算2017年1月到2017年12月之间的月数,所以我将您的宏变量重命名为months

答案 1 :(得分:0)

我想你想在显式SQL传递中做到这一点。要做到这一点,你必须使用这样的东西,你可以使用Teradata特定的功能。

/* define  date as Teradata Understands*/
     %let a= '2017-01-01';
    %let b= '2017-12-01';

 /* use either of solutions and I do not have Teradata handy, so I did
 not   explicitly checked this */

SELECT  CAST(&b AS DATE) - CAST(&a AS DATE) MONTH(4);

select floor(MONTHS_BETWEEN(date &b - date &a));