Oracle months_between函数计算月份差部分记录少算1个月问题求助
问题原因
- Oracle 原生
MONTHS_BETWEEN函数的计算规则限制:仅当两个日期的日部分相等、或较晚日期为当月最后一天时,返回整数月份差;剩余场景小数部分按「日差值/31」计算 - 你提供的样例中,较早日期为2020年10月29日,较晚日期为2021年2月28日:2021年2月无29日,函数返回的实际值为
3.9677左右,外层FLOOR函数直接舍去小数部分,最终得到3的异常结果
适配方案
根据你的业务需求二选一即可:
- 需求为按自然月序号统计差值(只要跨N个月份就算N),替换为如下计算逻辑:
select ID, (extract(year from cast(a.VLD_FRM_TMS as date)) * 12 + extract(month from cast(a.VLD_FRM_TMS as date))) - (extract(year from b.STRT_DT) * 12 + extract(month from b.STRT_DT)) as delta from TABLE_A a inner join TABLE_B b on a.ID = b.ID
- 需求为不满整月也向上取整计数,将原逻辑中的
FLOOR替换为CEIL即可:
select ID, ceil (months_between (cast(a.VLD_FRM_TMS as date), STRT_DT)) as delta from TABLE_A a inner join TABLE_B b on a.ID = b.ID
内容的提问来源于stack exchange,提问作者Salvatore Vitale
相关产品推荐
相关产品推荐

