SAS Proc SQL中含未知日标识的日期与固定日期的比较方法咨询
现有代码的问题
- 语法错误:
Scan(Date_A,2,'-',best10.)存在参数嵌套错误,best10.是input()的入参,不应放在scan()的参数列表中,同时整段where条件的括号未闭合。 - 逻辑疏漏:仅比较月份未校验年份,会出现
2019-12这类更早年份的Date_B被误判为大于2020-11的Date_A的问题。 - 类型不兼容:Date_B为带
UN的字符串类型,直接和日期类型的Date_A比较会触发隐式类型转换报错。
可行实现方案
核心逻辑是先通过scan(Date_B,3,'-')判断日部分是否为UN,分分支处理比较规则,代码示例如下:
proc sql; select A.DATE format=yymmdd10. as Date_A, B.DATE as Date_B from A.TABLE, B.TABLE where /* Date_B日为UN时,仅比较年月 */ (scan(B.DATE,3,'-') = 'UN' and input(cats(scan(B.DATE,1,'-'),scan(B.DATE,2,'-')),best8.) < input(cats(scan(A.DATE,1,'-'),scan(A.DATE,2,'-')),best8.)) /* Date_B为完整日期时,转成SAS日期后直接比较 */ or (scan(B.DATE,3,'-') ne 'UN' and input(B.DATE,yymmdd10.) < A.DATE); quit;
优化提示
如果A.DATE已经是SAS原生日期类型,可以把年月比较逻辑替换为input(put(A.DATE,yymmn6.),best6.),不需要再做字符串切割,运行效率更高。
内容的提问来源于stack exchange,提问作者Lymz
相关产品推荐
相关产品推荐

