Spark Scala的months_between()函数返回值存疑,求小数部分精准计算方法
Spark Scala中months_between小数部分的计算逻辑
Spark里的months_between(endDate, startDate)函数,计算月份差的逻辑和直接算天数除以平均每月天数完全不一样,它是分两步算的:
1. 先算完整月份数
- 如果起始日期的日 ≤ 结束日期的日:完整月份数 = (结束年 - 起始年)*12 + (结束月 - 起始月)
- 如果起始日期的日 > 结束日期的日:完整月份数要在上面的基础上减1
2. 再算小数部分
小数部分是剩余天数除以结束日期所在月份的总天数,剩余天数的算法分两种:
- 起始日 ≤ 结束日:剩余天数 = 结束日 - 起始日
- 起始日 > 结束日:剩余天数 = 结束日 + 起始月的总天数 - 起始日
对应你的结果分析
你得到的小数部分是0.48387097,这个数正好等于15/31 ≈ 0.4838709677,而31是2026年3月的天数,说明计算时用了15天作为剩余天数。
反推的话,15天的来源是:结束日(8) + 起始月天数 - 起始日(24) =15,算出来起始月天数是31天——但2025年2月只有28天,这说明要么你输入的起始日期不是2025-02-24(比如是2025-01-24,1月有31天,此时8+31-24=15,刚好匹配),要么是你在调用函数时搞反了起始日期和结束日期的参数顺序?
另外你提到直接算天数差是377天(对应12个月12天),这和months_between的结果有差异,原因就是两者的计算逻辑完全不同:
- 直接算天数差是统计两个日期之间的实际总天数,再按每个月30天或实际月份天数去折算
- 而
months_between是先算完整的月份跨度,再用剩余天数除以结束月的天数得到小数部分,不是按总天数除以平均每月天数
内容的提问来源于stack exchange,提问作者Sagar Kumar Bhagwani
相关产品推荐
相关产品推荐

