1. 问题描述
在资产折旧摊销计算中,我们常常需要计算两个日期之间的月份数,以便确定当期的折旧摊销月份数。虽然可以使用DATADIF函数来快速计算两个日期之间的折旧摊销月份数,但可能会出现一些未预料到的错误。
例如,如果我们假设上期末为2022年12月31日,本期末为2023年6月30日,那么这两个日期之间间隔的月份数应该是6个月。
然而,如果使用DATEDIF函数来计算这个月份数,却会得到5个月的结果。
在线文档示例: 点击查看
错误的计算结果示例,如下:
start_date | end_date | 公式 | 结果 |
---|---|---|---|
2022-12-31 | 2023-06-30 | =DATEDIF(start_date,end_date,"M") | 5 |
2. 原因说明
DATADIF函数中M
参数对于“整月”的判断,既不是按30天也不是31天等,是变动的;中间的月份不影响,主要是看最后一个月
的天
数字与开始日期
的天
数字对比,
以上文数据为例,=DATEDIF("2022-12-31","2023-06-30","M")
的算法为:
-
中间的月份不看
天
,只看年月
:- 从
2022-12-31
到2023-01-31
,满 1 个月; - 从
2022-12-31
到2023-02-28
,满 2 个月; - 从
2022-12-31
到2023-03-31
,满 3 个月; - 从
2022-12-31
到2023-04-30
,满 4 个月; - 从
2022-12-31
到2023-05-31
,满 5 个月;
- 从
-
最后一个月看
天
:- 判断最后一个月是否完整,需要比较从
2023-05-31
到2023-06-30
这个区间; - 开始日期(
2022-12-31
)的天数是 31; - 结束日期(
2023-06-30
)的天数是 30; - 因为
30 < 31
,结束日期的天数小于开始日期的天数,所以DATEDIF
函数认为这最后一个月不是一个完整的月份。
- 判断最后一个月是否完整,需要比较从
-
结果:
- 函数只计算了5个完整的月份,所以结果为
5
。
- 函数只计算了5个完整的月份,所以结果为
然后,我们在计算折旧摊销时,其实是想得到结果6
的,这与我们想要的结果不符。
3. 解决办法
3.1. 方法概述
由于 DATEDIF
是一个为了兼容旧版 Lotus 1-2-3
而保留的“隐藏”函数,它在某些边缘情况下可能存在问题。如果我们想计算月份的差异,更透明、更稳健的做法使用YEAR
与MONTH
函数的组合,来提取两个日期中的月份数,并手动计算它们之间的差值。这样可以确保计算结果的准确性和可靠性。
3.2. 在线文档示例
《【示例】固定资产(不含减值)年限平均法折旧测算公式》在线文档示例: 点击查看
3.3. 公式解析
3.3.1. 固定资产年限平均法折旧测算公式
项目 | 公式 |
---|---|
累计折旧月份 | =MIN([使用年限]*12,MAX(0,(YEAR([本期期末日期])-YEAR([开始使用日期]))*12+MONTH([本期期末日期])-MONTH([开始使用日期]))) |
本期折旧月份 | =[累计折旧月份]-MIN([使用年限]*12,MAX(0,(YEAR(EOMONTH([本期期初日期],-1))-YEAR([开始使用日期]))*12+MONTH(EOMONTH([本期期初日期],-1))-MONTH([开始使用日期]))) |
3.3.2. 无形资产直线法摊销测算公式
项目 | 公式 |
---|---|
累计摊销月份 | =MIN([使用年限]*12,MAX(0,(YEAR([本期期末日期])-YEAR([开始使用日期]))*12+MONTH([本期期末日期])-MONTH([开始使用日期])+1)) |
本期摊销月份 | =[累计摊销月份]-MIN([使用年限]*12,MAX(0,(YEAR(EOMONTH([本期期初日期],-1))-YEAR([开始使用日期]))*12+MONTH(EOMONTH([本期期初日期],-1))-MONTH([开始使用日期])+1)) |
3.3.3. 固定资产折旧与无形资产摊销的区别
固定资产应当按月计提折旧,当月增加的固定资产,当月不计提折旧,从下月起计提折旧;当月减少的固定资产,当月仍计提折旧,从下月起不计提折旧。使用寿命有限的无形资产,其应摊销金额应当在使用寿命内系统合理摊销。
企业摊销无形资产,应当自无形资产可供使用时起,至不再作为无形资产确认时止。企业选择的无形资产摊销方法,应当反映与该项无形资产有关的经济利益的预期实现方式。无法可靠确定预期实现方式的,应当采用直线法摊销。无形资产的摊销金额一般应当计入当期损益,其他会计准则另有规定的除外。
4. FAQ
4.1. 累计折旧月份数可不可以直接两个日期做差除以30天?
答:不可以。
分析:当资产可使用年限较大时,简单做差除以30太难会出现多计折旧月份数的错误;以“2012-12-31”与“2023-6-30”之间月份差计算为例,分析如下:
类型 | 公式 | 结果 | 说明 |
---|---|---|---|
做差除以30天法 | =(DATE(2023,6,30)-DATE(2012,12,31))/30 |
128 | 错误 |
本文示例(YEAR+MONTH法) | =(YEAR(DATE(2023,6,30))-YEAR(DATE(2012,12,31)))*12+MONTH(DATE(2023,6,30))-MONTH(DATE(2012,12,31)) |
126 | 正确 |
在线文档示例: 点击查看
4.2. DATEDIF 函数是什么?怎么用?
DATEDIF 函数用法: 点击查看
4.3. 我就想使用DATEDIF,有没有解决办法?有!使用 TEXT 函数对日期整形!
(1)解决办法概述
除了上述使用YEAR
与MONTH
函数组合的方式计算月份差,还可以使用TEXT
对日期格式整形后,再使用DATEDIF
,示例如下:
=DATEDIF(TEXT([开始日期],"YYYY-MM"), TEXT([结束日期],"YYYY-MM"), "M")
(2)解释说明
这个公式的核心在于 TEXT
函数。它先将原始日期转换成了文本。
当 DATEDIF
函数的参数是一个形如 "YYYY-MM"
的文本时,Excel会自动将其解析为该月份的第一天。如:"2022-12"
被当作 2022-12-01
,"2023-06"
被当作 2023-06-01
。
因此,这个公式实际上等同于: =DATEDIF(TEXT([开始日期],"YYYY-MM-01"), TEXT([结束日期],"YYYY-MM-01"), "M")
。
在这个新的计算中,开始日期的天数是 1,结束日期的天数也是 1;因为 1 >= 1
,所以最后一个月会被计算在内。
(3)举例
类型 | 公式 | 结果 | 说明 |
---|---|---|---|
不整形的计算公式 | =DATEDIF("2022-12-31","2023-06-30","M") |
5 | 错误 |
TEXT 整形后的计算公式 |
=DATEDIF(TEXT("2022-12-31","YYYY-MM"),TEXT("2023-06-30","YYYY-MM"),"M") |
6 | 正确 |