Excel中有個工作表函數DateDif,專門用來計算兩日期之間的日差、月差、年差,傳說十分好用。
具體用法在此就省略了,好奇的童鞋請自行*度~
可是,在Excel里,他卻是個“沒戶口”的……且至今還是“黑戶”……這都多少年過去了,他這戶口問題,到現在沒解決!
有人說,那是因為DateDif有BUG,別的不說,就看這:
從1月31日到3月1日之間 忽略年和月的單純的日差,差,呃,-2天?你說他怎么想的?公式結果都混成這樣了,還想報戶口?難怪黑戶了!
可是,你造嗎?DateDif童鞋這是在背鍋……
這話,就得從工作表中的日期本質開始說起了,事實上,日期就是數值穿了件外衣,數值就是日期的裸奔形式……咳咳,有點扯遠了,好吧我們來看這個:
B2里顯示的是數值“44470”,對他設置單元格數字格式時,里面【短日期】和【長日期】的選項就是2021年10月1日,所以“44470”其實是在裸奔……咳咳……不是,我其實想說,日期,是一個連續的值,從1900年1月1日起,每一天相當於數值1,一路小跑到今天,終於奔到了44470……(暫時忽略1900-2-29的問題)
再重復一遍:工作表日期,從1900-1-1至9999-12-31,本質上是一個連續的數值、連續的數值、連續的數值、連續的!連續的!連續的!
所以,DateDif函數的結果也是連續的!連續的!連續的!
從1月1日起,到2月25日、26日……3月1日、2日,年差都是0,月差從1到2,日差也都是順着來,這,沒毛病嗎?
可是,從1月31日起,毛病就來了……
你說,人家能怎么辦呢?從月的角度來看,1月31日到3月1日之間,確實是相隔一個月以上了,一個1月一個3月啊,但兩者的日期相隔呢?呃29天?好像有道理,所以,1月31日到3月1日之間相隔了一個月外加29天?這小學算術是誰教的?
再加上之前一直強調的,日期是個連續的數值,DateDif的結果也是連續的數值,所以這里不用負數用誰啊?否則你讓人家怎么連續啊?
那么話又說回來了,這鍋,DateDif童鞋究竟是在為誰背?
為設計日期的那個家伙!因為每個月的天數有差異,有28天、有29天、有30天、有31天。
所以,當DateDif里的起始日期是1-27日時,人家絕對是函數界里的五好青年,不怕苦不怕累埋頭苦干兢兢業業計算着每兩個日期之間的各種差……
好吧,我這話說太早了,從1月27日到2月27日(非閏年)之間,相差幾個月幾天?1個月0天,好像是對的,可是,好像,又有哪里不對?!
1月27日距月底還有4天,2月27日距月底,就1天了,怎么能說這二位相差1個月0天?
所以,在我們認知當中,日期差有兩個標准,一是以月初為標准,另一是以月末為標准,月初都是從1日開始,這個沒毛病, 而月末……
我們是否可以設計一套函數,把月末作為標准呢?這個,嗯,可以有!
公式如下:
Y:=YEAR(EDATE(B3+DAY(EOMONTH(A3,0))-DAY(A3)+1,-MONTH(A3)))-YEAR(A3)
YM:=MOD(MONTH(B3+DAY(EOMONTH(A3,0))-DAY(A3)+1)+11-MONTH(A3),12)
MD: =DAY(B3+DAY(EOMONTH(A3,0))-DAY(A3)+1)-1
如此一來,日期間隔有了兩個標准,理論上是可以用IF來加個判斷,某天(比如28日)之前的用DateDif,之后的用月末標准。但是這樣一來,必然又會出現另一個問題,明明起始日期不是同一天,相差結果卻是一樣,抽嘴角……
所以,這個BUG,其實是解決不了了,大概這才是導致DateDif這位大好青年一直以來“黑戶”的真正原因吧。
徹底解決的辦法有沒有呢?
肯定是有的,那就是改日期規則,每年12個月、每月全部固定30天,多下來5、6天怎么辦呢?
全部算假期唄~