如何处理带引号的SAS日期并调整sysfunc函数?
解决SAS宏中带引号日期的sysfunc处理问题
这个问题很常见,核心原因是当你的宏变量&date.带有单引号时,直接传入inputn函数会让它收到整个带引号的字符串(比如'2017-01-01'),而inputn需要的是不带引号的纯日期文本,所以无法正确解析。下面是几种可行的调整方案:
方法1:使用dequote函数去除引号
%sysfunc(dequote())可以自动移除字符串两端的单引号或双引号,提取出内部的纯日期内容,这是最通用的解决方案:
%let date='2017-01-01'; %let et=%sysfunc(intnx(month,%sysfunc(inputn(%sysfunc(dequote(&date.)),yymmdd10.)),2,s),yymmn6.); %put &et.;
执行后&et.会正确输出201703,符合intnx计算2个月后的结果。
方法2:通过字符串截取提取纯日期
如果确定宏变量的引号是固定的单引号且日期格式长度固定(比如10位的YYYY-MM-DD),可以用substr函数截取中间的日期部分:
%let date='2017-01-01'; %let et=%sysfunc(intnx(month,%sysfunc(inputn(%sysfunc(substr(&date.,2,10)),yymmdd10.)),2,s),yymmn6.); %put &et.;
这里%sysfunc(substr(&date.,2,10))会从第2个字符开始截取10位,得到2017-01-01,再传给inputn即可正常解析。不过这种方法灵活性较差,如果日期格式长度变化或引号类型改变(比如双引号)就会失效。
方法3:直接定义不带引号的宏变量(如果可控)
如果能控制宏变量的定义环节,直接去掉引号是最省心的方式:
%let date=2017-01-01; %let et=%sysfunc(intnx(month,%sysfunc(inputn(&date.,yymmdd10.)),2,s),yymmn6.); %put &et.;
内容的提问来源于stack exchange,提问作者geetha
相关产品推荐
相关产品推荐

