SAS sysdate日期运算报整数常量错误原因及修正方法
错误原因排查
&sysdate是SAS内置自动宏变量,存储值为SAS会话启动时的日期字符串(例如此次运行中解析为10JUN22),本身不是可直接参与算术运算的数值型SAS日期值,直接在后面拼接-7无法被SAS识别为合法的日期偏移逻辑。- 原代码语法不符合SAS输出语句规则:
@标识符后要求接整数类型的列位置值、或合法的输出变量/计算值,你直接把Format=选项跟在未闭合的无效表达式后,SAS解析到该位置时无法识别合法值,因此抛出ERROR 22-322: Expecting an integer constant报错。
可直接运行的修正代码
写法1:语句内直接计算(无需额外定义变量)
用日期常量转换+宏函数完成偏移计算,直接嵌入输出语句:
"WEEK OVER WEEK COMPARISON SUMMARY" @%sysfunc(intnx(day,"&sysdate"d,-7)) Format=MMDDYYS10.;
代码逻辑说明:
"&sysdate"d是SAS标准日期常量写法,会把宏解析出的日期字符串转为数值型日期值(存储为距1960年1月1日的天数,可直接做算术运算)%sysfunc(intnx(day, <日期值>, -7))会调用SAS日期函数,将日期往前推7天,返回纯整数结果,完全符合@后的值类型要求
写法2:提前定义宏变量(适合多次复用周前日期的场景)
如果后续代码还要用到一周前的日期,可以提前把计算好的带格式值存到宏变量里,代码更简洁:
/* 提前计算并格式化一周前的日期,存入宏变量 */ %let last_week_date = %sysfunc(intnx(day,"&sysdate"d,-7),MMDDYYS10.); /* 输出时直接调用宏变量即可 */ "WEEK OVER WEEK COMPARISON SUMMARY" @&last_week_date;
补充提示:如果需要取代码运行时刻的实时日期(而非SAS会话启动时的日期,避免SAS长时间挂起导致日期不准),可以把代码里的
"&sysdate"d替换为%sysfunc(today())即可。
内容的提问来源于stack exchange,提问作者LMS
相关产品推荐
相关产品推荐

