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

如何计算两日期列间的月份数(忽略日期中的日部分)

解决方法:忽略日部分计算两个日期的月份差

要实现忽略日期中的「日」部分,仅基于年月计算两个日期的月份差,有两种简单可靠的方案,以下以MySQL为例说明(其他数据库逻辑类似,仅函数名可能略有差异):

方案一:直接基于年份和月份数值计算

直接提取两个日期的年、月数值,通过算术运算得到月份差,这是最直观且性能最优的方式,完全不受日部分影响:

SELECT
    id_doc,
    fecIn,
    fecAlt,
    -- 计算年月差:年份差×12 + 月份差
    (YEAR(fecAlt) - YEAR(fecIn)) * 12 + (MONTH(fecAlt) - MONTH(fecIn)) AS month_diff
FROM
    你的表名;

示例结果

假设样本数据如下:

id_docfecInfecAltmonth_diff
12022-03-152022-05-202
22023-01-312023-01-050
32021-10-022024-02-2828

这个结果完全符合「忽略日部分」的需求:只要年月相同,无论日是几号,差值都是0;年月不同则直接按数值差计算。

方案二:转换为当月第一天后用TIMESTAMPDIFF

如果你更倾向于用日期函数计算,可以先把两个日期转换为当月第一天,再用TIMESTAMPDIFF计算月份差,这样就排除了日部分的干扰:

SELECT
    id_doc,
    fecIn,
    fecAlt,
    TIMESTAMPDIFF(
        MONTH,
        -- 将fecIn转换为当月第一天
        STR_TO_DATE(DATE_FORMAT(fecIn, '%Y-%m'), '%Y-%m'),
        -- 将fecAlt转换为当月第一天
        STR_TO_DATE(DATE_FORMAT(fecAlt, '%Y-%m'), '%Y-%m')
    ) AS month_diff
FROM
    你的表名;

为什么之前的TIMESTAMPDIFF没得到预期结果?

如果直接用原日期调用TIMESTAMPDIFF(MONTH, fecIn, fecAlt),函数会判断两个日期是否跨越了月份边界。例如2023-05-30和2023-06-01会返回1,这是函数的正常逻辑——但如果你的需求是「只要年月相同就算0,不管日的大小」,直接用原日期计算就会和预期不符,这时候就需要先将日期转换为当月第一天再计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:35:10