SAS代码错误排查:INTCK函数参数非数值报错问题
问题排查与解决
首先,咱们来揪出报错的核心原因:你定义的宏变量a和b已经包含了单引号,再叠加日期字面量的引号与d后缀时,生成了SAS无法识别的无效格式。
咱们拆解下宏替换后的实际代码就能一目了然:
- 你写的
"&a"d会被宏处理器替换成"'2017-01-01'"d - 同理
"&b"d会变成"'2017-12-01'"d
SAS的日期字面量要求是'YYYY-MM-DD'd这种格式——单引号包裹日期字符串,后面跟d后缀。但上面的替换结果是双引号套单引号的畸形格式,SAS根本没法把它解析成合法的日期数值,所以才会抛出“参数不是数字”的错误。
两种可行的修正方案:
方案1:定义宏变量时去掉单引号
直接把宏变量的值设为纯日期字符串,使用时再添加单引号和d后缀:
%let a=2017-01-01; %let b=2017-12-01; %let days = %sysfunc(intck(month,"&a"d,"&b"d)); %put &days;
宏替换后会生成合法的调用:intck(month,'2017-01-01'd,'2017-12-01'd),能正常返回结果11。
方案2:直接引用带单引号的宏变量,不再额外加引号
如果一定要保留宏变量里的单引号,使用时直接引用宏变量,后面加d后缀即可:
%let a='2017-01-01'; %let b='2017-12-01'; %let days = %sysfunc(intck(month,&a.d,&b.d)); %put &days;
这种写法替换后同样会生成合法的日期字面量,得到正确结果。
内容的提问来源于stack exchange,提问作者anand anand
相关产品推荐
相关产品推荐

