PLSQL中基于bill_date字段筛选上月客户账单数据的实现问题
解决方案
核心需求为筛选bill_acct_billcycle表中bill_date属于上一自然月的所有记录,不受不同客户账单日差异的影响,可通过月份维度匹配实现全覆盖:
- 核心判断逻辑:将
bill_date截断到月份维度,和系统时间上个月的截断月份对比,只要属于同一个月就匹配,不受具体账单日是几号的影响。
Oracle 语法实现
在原游标c1的WHERE条件中添加如下判断即可:
AND TRUNC(bab.bill_date, 'MM') = TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM')
逻辑说明
TRUNC(date, 'MM'):将日期截断到当月第一天,比如2024-03-15截断后为2024-03-01ADD_MONTHS(SYSDATE, -1):获取当前时间往前推1个月的日期- 两者截断到月份后对比,所有上个月任意日期的
bill_date都会被匹配到,完全覆盖不同客户的不同账单日场景
修改后完整游标代码
CURSOR c1 IS SELECT DISTINCT intl_prod_id FROM apld_bill_rt abr, acct_bill ab, bill_acct_billcycle bab WHERE abr.CHRG_TP = 'INSTALLMENT' AND abr.TAX_CATG_ID = 'NOTAX' AND abr.acct_bill_id = ab.acct_bill_id AND ab.bill_date = bab.bill_date -- 新增上月匹配逻辑 AND TRUNC(bab.bill_date, 'MM') = TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM');
扩展适配方案(可选)
如果后续需要灵活指定统计月份,不需要写死取上个月,可以给存储过程加一个日期入参p_stat_date DATE DEFAULT SYSDATE,把匹配逻辑改成:
AND TRUNC(bab.bill_date, 'MM') = TRUNC(ADD_MONTHS(p_stat_date, -1), 'MM')
默认还是统计上个月,传其他日期就统计对应日期的上个月数据,适配性更强。
内容的提问来源于stack exchange,提问作者vitaminJava
相关产品推荐
相关产品推荐

