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天怎么办呢?

全部算假期呗~

替DateDif哭诉一把(Excel函数集团)的更多相关文章

  1. LET函数(Excel函数集团)

    LET函数,是个Office365新增函数,所以,还在用上古版本的童鞋请无视此篇哈~ 话说Excel中,有个自定义名称的功能,如下图,左右两个表分别自定义了"data1"和&quo ...

  2. Vlookup大叔与一对多查找(Excel函数集团)

    所谓一对多查找,就是根据一个条件,把多个符合条件的结果全部找出来. 其实吧,一对多查找不是什么,尤其是O365的Filter函数横空出世震撼全场之后,简直就是瞬间把所有传统的数组解法甩出去七八十来条街 ...

  3. Vlookup大叔早已油腻(Excel函数集团)

    1.Vlookup基础用法:https://mp.weixin.qq.com/s/0JRytWlBD-KYM2jkecG2rA 2.合并字符串:https://mp.weixin.qq.com/s/9 ...

  4. 字符串函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业!谢谢 下载地址:https://officecommunity-m ...

  5. 日期与时间函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业!谢谢 下载地址:https://officecommunity-m ...

  6. 统计函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业! 谢谢 下载地址:https://officecommunity- ...

  7. 数组基础(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业! 谢谢 下载地址:https://officecommunity- ...

  8. 数据库函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业! 谢谢 下载地址:https://officecommunity- ...

  9. 其他(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业!谢谢 下载地址:https://officecommunity-m ...

随机推荐

  1. [hdu4388]Stone Game II

    不管是否使用技能,发现操作前后所有堆二进制中1的个数之和不变.那么对于一个堆其实可以等价转换为一个k个石子的堆(k为该数二进制的个数),然后就是个nim游戏. 1 #include<bits/s ...

  2. [cf582E]Boolean Function

    由于每一个运算都有括号,因此添加的运算不会改变运算顺序 先将其建出一棵表达式树,也就是维护两个栈,是节点和运算符优先级单调递增的栈(设置左括号优先级最低,右括号弹出直至左括号) 每一次运算,也就是新建 ...

  3. 掌握Java的内存模型,你就是解决并发问题最靓的仔

    摘要:如果编写的并发程序出现问题时,很难通过调试来解决相应的问题,此时,需要一行行的检查代码,这个时候,如果充分理解并掌握了Java的内存模型,你就能够很快分析并定位出问题所在. 本文分享自华为云社区 ...

  4. C/C++ Qt TreeWidget 单层树形组件应用

    TreeWidget 目录树组件,该组件适用于创建和管理目录树结构,在开发中我们经常会把它当作一个升级版的ListView组件使用,因为ListView每次只能显示一列数据集,而使用TableWidg ...

  5. Redis线程模型的前世今生

    一.概述 众所周知,Redis是一个高性能的数据存储框架,在高并发的系统设计中,Redis也是一个比较关键的组件,是我们提升系统性能的一大利器.深入去理解Redis高性能的原理显得越发重要,当然Red ...

  6. Go语言核心36讲(Go语言实战与应用十八)--学习笔记

    40 | io包中的接口和工具 (上) 我们在前几篇文章中,主要讨论了strings.Builder.strings.Reader和bytes.Buffer这三个数据类型. 知识回顾 还记得吗?当时我 ...

  7. 【虚树学习笔记([SDOI2011]消耗战)】

    题意 [SDOI2011]消耗战 想法 首先我们可以很自然的想到怎么在整棵树上进行求解\(DP\) 很简单 每个点有两个选择 要么对其子树的关键点递归求解 要么自己断开 当然断开的\(cost\)为其 ...

  8. Codeforces 571D - Campus(并查集+线段树+DFS 序,hot tea)

    Codeforces 题目传送门 & 洛谷题目传送门 看到集合的合并,可以本能地想到并查集. 不过这题的操作与传统意义上的并查集不太一样,传统意义上的并查集一般是用来判断连通性的,而此题还需支 ...

  9. JS 执行上下文的一次理解

    执行上下文 执行上下文概念 当代码运行时,会产生一个对应的执行环境,在这个环境中,变量会被事先提出来(变量提升),代码从上往下开始执行,就叫做执行上下文. 注:在定义变量是未直接赋值,使用默认值 un ...

  10. nohup使用

    nohup:不挂断运行 在忽略挂起信号的情况下运行给定的命令,以便在注销后命令可以在后台继续运行. 可以这么理解:不挂断的运行,注意并没有后台运行的功能,就是指,用nohup 运行命令可以是命令永远运 ...