自认为最精确的日期段核算公式,请大侠斧正
在收取商管费、房租时,经常涉及起始日期、结束日期之间的时间段,费用收取问题。比如:商管费每平方每月2元,租金每平方每月40元等。
收取时,难免各算法,难以服众。
没办法,采用扳手指的算法,将时间段划分为:
起始月的头日数+完整月数+结束月的尾巴日数,折算成对应月数。
比如:1月31日至3月1日,连续天数为30天,实际为一个月零2天
1月31日至4月1日,实际为2个月零2天,这两天的权重还不一样。
废话不多说,直接上样板,注意,结果在W列。
请各位大侠,百忙之中,检查一下是否正确。谢谢
公式比较臭长。
=IF(AND(YEAR(B2)=YEAR(C2),MONTH(B2)=MONTH(C2)),(C2- B2+1)/DAY(EOMONTH(B2,0)),(EOMONTH(B2,0)- B2+1)/DAY(EOMONTH(B2,0)))+IF(AND(YEAR(B2)=YEAR(C2),MONTH(B2)=MONTH(C2)),0,DAY(C2)/DAY(EOMONTH(C2,0)))+IF(ISERROR(DATEDIF(EOMONTH(B2,0)+1, DATE(YEAR(C2),MONTH(C2),1),"m")),0,DATEDIF(EOMONTH(B2,0)+1, DATE(YEAR(C2),MONTH(C2),1),"m")) 1月31日至3月1日,连续天数为30天,实际为一个月零2天
1月31日至4月1日,实际为2个月零2天,这两天的权重还不一样。
算出来的结果为:1.064516 月 和 2.065591 月 自定义函数,凑出来了!!!!!!!!!!!!!
Function rqd(ks, js) '开始日期,结束日期
'######################计算开比
If (Year(ks) = Year(js) And Month(ks) = Month(js)) Then '开始日期和结束日期是同年同月
kb1 = (js - ks + 1)
kb2 = Day(DateSerial(Year(ks), Month(ks) + 1, 0)) '这一句的意思是找到当月最大的一天的数字
kb = kb1 / kb2 '开比:开始段日数和开始当月日期数的比例
Else
kb1 = Day(ks)
kb2 = Day(DateSerial(Year(ks), Month(ks) + 1, 0))
kb1 = kb2 - kb1 + 1
kb = kb1 / kb2 '开比:开始段日数和开始当月日期数的比例
End If
'######################计算结比
If (Year(ks) = Year(js) And Month(ks) = Month(js)) Then '开始日期和结束日期是同年同月
jb = 0
Else
jb = Day(js) / Day(DateSerial(Year(js), Month(js) + 1, 0)) '结比:结束段日数和结束当月日期数的比例
End If
'####################计算中间的整月数目
If (Year(ks) = Year(js) And Month(ks) = Month(js)) Then
YS = 0
Else
AA = DateSerial(Year(ks), Month(ks) + 1, 0) '开始月的尾巴===========》开始月下月的第一天的日子 DateSerial(Year(ks), Month(ks) + 1, 1)
BB = js - Day(js) '结束月的头==============》结束月上月的最后一天的日子
YS = DateDiff("m", AA, BB) '中段整月数,datedif(ks的尾巴日,结束的第一日)====DATEDIF(EOMONTH(B2,0)+1, DATE(YEAR(C2),MONTH(C2),1),"m")
End If
rqd = YS + jb + kb
End Function 彻底终结了,按月收费和按天收费的争论,我可以自豪的说,我这是按日历牌收费的! 准不准主要看规定吧,有了规定就好办,没有不准的公式,关键是规则没有漏洞
页:
[1]