SAS Data Step生成的月度首尾日期如何适配PROC SQL WHERE子句格式
问题核心原因
- 你在
DATA _NULL_步生成的begindt、enddt是步内临时变量,步骤运行结束后就会被销毁,后续PROC SQL无法直接读取该变量 - 硬编码的
'2021-09-01'是字符型常量,SAS原生日期值是从1960-01-01开始计数的整数,二者存储格式完全不同,直接匹配会失败
解决步骤
1. 修改DATA _NULL_步,将日期存入全局宏变量
修改后的代码如下,用call symputx把日期值存入宏变量,后续所有步骤都可以通过&变量名的形式调用:
Data _NULL_; begindt=IntNX("Month", Date(), 0) ; enddt=IntNX("Month", Date(),0,'E'); /* 存储为宏变量,第一个参数是宏变量名,第二个是要存储的数值 */ call symputx('begindt', begindt); call symputx('enddt', enddt); PUT begindt=E8601DA. enddt=E8601DA.; Run;
你可以在DATA步运行后加%put &begindt.; %put %sysfunc(putn(&begindt., E8601DA10.));验证宏变量是否生成正确。
2. 根据字段类型调整PROC SQL的WHERE条件
根据你的CLEAR_DOC_POSTING_DATE字段的实际类型,二选一即可:
- 如果字段是SAS数值型日期(仅展示格式为YYYY-MM-DD,底层存储是整数天数)
直接引用宏变量即可:AND "DETAILAR"."CLEAR_DOC_POSTING_DATE" = &begindt. - 如果字段是字符型,存储格式为YYYY-MM-DD
可以选择把宏变量转为对应格式的字符,或者把字段转为SAS日期值匹配:/* 方法1:宏变量转字符匹配,性能更优 */ AND "DETAILAR"."CLEAR_DOC_POSTING_DATE" = put(&begindt., E8601DA10.) /* 方法2:字段转SAS日期值匹配 */ AND input("DETAILAR"."CLEAR_DOC_POSTING_DATE", E8601DA10.) = &begindt.
内容的提问来源于stack exchange,提问作者jmcclung78
相关产品推荐
相关产品推荐

