如何计算两日期列间的月份数(忽略日期中的日部分)
解决方法:忽略日部分计算两个日期的月份差
要实现忽略日期中的「日」部分,仅基于年月计算两个日期的月份差,有两种简单可靠的方案,以下以MySQL为例说明(其他数据库逻辑类似,仅函数名可能略有差异):
方案一:直接基于年份和月份数值计算
直接提取两个日期的年、月数值,通过算术运算得到月份差,这是最直观且性能最优的方式,完全不受日部分影响:
SELECT id_doc, fecIn, fecAlt, -- 计算年月差:年份差×12 + 月份差 (YEAR(fecAlt) - YEAR(fecIn)) * 12 + (MONTH(fecAlt) - MONTH(fecIn)) AS month_diff FROM 你的表名;
示例结果
假设样本数据如下:
| id_doc | fecIn | fecAlt | month_diff |
|---|---|---|---|
| 1 | 2022-03-15 | 2022-05-20 | 2 |
| 2 | 2023-01-31 | 2023-01-05 | 0 |
| 3 | 2021-10-02 | 2024-02-28 | 28 |
这个结果完全符合「忽略日部分」的需求:只要年月相同,无论日是几号,差值都是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
相关产品推荐
相关产品推荐

