You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAS Proc SQL中日期过滤方式不同导致结果差异的问题排查

问题分析与修正方案

错误原因

你修改后的where子句逻辑完全错误:

where blng_dt between intnx('month', blng_dt, -2, 'b') and intnx('month', blng_dt, -2, 'e')

这里用每行的blng_dt作为intnx的起始日期,相当于对每一行单独计算一个日期范围(当前行日期往前推2个月的首尾),然后判断该行日期是否落在这个自己的范围内。只有当某行的blng_dt恰好等于它所在月份往前推2个月的某个日期时才会被选中,这就是结果行数骤降的核心原因。

修正方案

要实现动态取「固定基准日期往前推2个月的整月数据」,需要用固定的基准日期(比如系统当前日期today())来计算日期范围,而不是依赖每行的blng_dt。同时原代码中distinct(t.shp_pro)与聚合函数混用的写法不规范,建议用group by替代,逻辑更清晰且执行效率更高。

修正后的代码:

libname orac oracle authdomain=XX path=XX schema=XX;
proc sql;
create table ship_bill_date as
select 
    t.shp_pro,
    min(t.blng_dt) as blng_dt,
    count(t.shp_pro) as count 
from orac.table_A t
where blng_dt between intnx('month', today(), -2, 'b') and intnx('month', today(), -2, 'e')
group by t.shp_pro;
quit;

补充说明

  • 如果不需要基于当前日期,而是要基于某个固定日期(比如你原来的'01-JUL-2023'd,往前推2个月就是5月),可以把today()替换成该固定日期:
    intnx('month', '01-JUL-2023'd, -2, 'b')
    
  • intnx函数的最后一个参数:'b'代表取月份起始(月初),'e'代表取月份结束(月末),确保覆盖整月所有数据。

内容的提问来源于stack exchange,提问作者Rogue258

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:55:13