以下代码有什么问题
%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
答案 0 :(得分:1)
三个问题:
您的日期不是SAS日期文字。 SAS日期文字的格式为'DDMMMYYYY'd
或'DDMMMYY'd
例如,01JAN2018'd
或01JAN18'd
。
您已在声明日期的宏变量周围加上引号,并在调用intck.
&
需要加days
前缀。
以下代码解决了这些问题:
%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));