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

Oracle months_between函数计算月份差部分记录少算1个月问题求助

问题原因
  • Oracle 原生MONTHS_BETWEEN函数的计算规则限制:仅当两个日期的日部分相等、或较晚日期为当月最后一天时,返回整数月份差;剩余场景小数部分按「日差值/31」计算
  • 你提供的样例中,较早日期为2020年10月29日,较晚日期为2021年2月28日:2021年2月无29日,函数返回的实际值为3.9677左右,外层FLOOR函数直接舍去小数部分,最终得到3的异常结果
适配方案

根据你的业务需求二选一即可:

  1. 需求为按自然月序号统计差值(只要跨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 
  1. 需求为不满整月也向上取整计数,将原逻辑中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 03:45:03