跳到主要内容

如何计算工龄

这个例子看起来非常简单,比如我是 2000 年入职,今年 2015 年,得出的结果应该是 15 年。可能会有用户认为,用 YEAR() 函数取两个年份,相减不就好了吗。可是我们要考虑到 2015.12.1-2016.5.1 这样的情况,只有 5 个月,不满整年,不能算作工龄。当然年龄也是一样,没有到周岁的时候,是不能算整岁的。因此用年份相减的算法我们予以否定。

1. 用天数折算成年数

比较相似的是,如果我计算天数呢,算出两个时间的天数差,然后除以 365,再取整,不就可以得到年份了吗。

下述代码可直接复制到公式编辑器内,注意替换终止时间和起始时间字段

{"text":"INT(DAYS(DATE(​终止时间​),DATE(​起始时间​))/365)","marks":[{"from":{"line":0,"ch":14,"sticky":null},"to":{"line":0,"ch":20,"sticky":null},"value":"dateField_ksj7dsfg","invalid":false},{"from":{"line":0,"ch":27,"sticky":null},"to":{"line":0,"ch":33,"sticky":null},"value":"dateField_ksj7dsfe","invalid":false}],"isCmData":true}

计算工龄

2. 用时间戳折算成年数

同理,机智的朋友们也可能直接从时间戳上入手,直接算出两个时间戳的差,然后用毫秒换算取整。

下述代码可直接复制到公式编辑器内,注意替换终止时间和起始时间字段

{"text":"IF(OR(ISEMPTY(​起始时间​),ISEMPTY(​终止时间​)),"",INT((​终止时间​-​起始时间​)/1000/60/60/24/365))","marks":[{"from":{"line":0,"ch":14,"sticky":null},"to":{"line":0,"ch":20,"sticky":null},"value":"dateField_ksj7dsfe","invalid":false},{"from":{"line":0,"ch":30,"sticky":null},"to":{"line":0,"ch":36,"sticky":null},"value":"dateField_ksj7dsfg","invalid":false},{"from":{"line":0,"ch":47,"sticky":null},"to":{"line":0,"ch":53,"sticky":null},"value":"dateField_ksj7dsfg","invalid":false},{"from":{"line":0,"ch":54,"sticky":null},"to":{"line":0,"ch":60,"sticky":null},"value":"dateField_ksj7dsfe","invalid":false}],"isCmData":true}

计算工龄

3. 精确计算方式

到了这里,细心的朋友会发现,不管用上面的哪一种算法,都不可避免的不精确。365 天只是一个年份的大约值,也有可能是366天。虽然影响结果的可能性比较低,但一些要求高的用户还是觉得不好。下面的终极解法,涉及到时间戳本身的定义,比较难理解,这里不要求掌握,有条件的朋友可研究看看。

用到的函数:DATE(),YEAR(),MONTH(),DAY()

是的没错,就用这 4 个函数,精确的计算整年,精确度为毫秒(时间戳的单位)。这里要清楚一个概念,时间戳的0值,是 1970年1月1日0:00:00。 文章的开头笔者说,用年份相减的办法算时间差,我们这里考虑把月份也相减,日期也相减,然后用 DATE() 把年月日合成时间对象。

假设一个情况,起始时间,2015年1月1日;截止时间,2015年10月1日,这两个相减,得到的应该是 DATE(0,10,0)。这里值得一提的是,0日可以看成上个月的最后一天,月份对应减去1即可。那么0年呢?我们知道公元1年和公元前1年之间是没有“0年”这个概念的。跟EXCEL一样,0-99 表示 1900年-1999年,从 100 开始,YEAR(DATE(100,1,1))得到的时间值就是公元 100 年,到后面都不会再有特殊。所以如果前后两个年份相差 5 年,用 YEAR 取值得到的应该是 1905 年,是完全不对的。

我这样写函数:

年份:YEAR(DATE(终止时间))-YEAR(DATE(初始时间))+100

月份:MONTH(DATE(终止时间))-MONTH(DATE(初始时间))+1

日期:DAY(DATE(终止时间))-DAY(DATE(初始时间))+2

这里我想大部分用户朋友都不明白了,年份+100 算是理解了,因为终止年份-初始年份如果小于 100,得到的值是 1900-1999 年。这里加上 100 可以在最后减去。那么为什么月份要+1呢,日期为什么+2呢?

我们设想一下:2015年10月1日-2016年9月30日,这里应该是一年整的。如果按照结尾不加1和2来计算,得到的应该是DATE(101,-1,-1),自动借位,得到的应该是“100年11月30日”,年份 -100,最后得到 11 个月零 30 天。

误差是来自哪里?

我们知道一年有 12 个月,如果两个时间差是 0 月,实际的时间里不存在0月这个情况,自动向年借 1 位,年份-1,月份变为 12 月,天数同理。因此为了避免这样的借位,我们给月份差和天数差各+1,让原本 0-11 的 12 进制变为 1-12 的 12 进制。最后考虑整年一般是 2015年10月1日-2016年9月30日这种,而不是 10月1日-次年10月1日。

所以最后的天数再加 1,这样最终公式为:

下述代码可直接复制到公式编辑器内,注意替换终止时间和起始时间字段

{"text":"IF(OR(ISEMPTY(​起始时间​),ISEMPTY(​终止时间​)),"",YEAR(DATE(YEAR(DATE(​终止时间​))-YEAR(DATE(​起始时间​))+100,MONTH(DATE(​终止时间​))-MONTH(DATE(​起始时间​))+1,DAY(DATE(​终止时间​))-DAY(DATE(​起始时间​))+2))-100)","marks":[{"from":{"line":0,"ch":14,"sticky":null},"to":{"line":0,"ch":20,"sticky":null},"value":"dateField_ksj7dsfe","invalid":false},{"from":{"line":0,"ch":30,"sticky":null},"to":{"line":0,"ch":36,"sticky":null},"value":"dateField_ksj7dsfg","invalid":false},{"from":{"line":0,"ch":62,"sticky":null},"to":{"line":0,"ch":68,"sticky":null},"value":"dateField_ksj7dsfg","invalid":false},{"from":{"line":0,"ch":81,"sticky":null},"to":{"line":0,"ch":87,"sticky":null},"value":"dateField_ksj7dsfe","invalid":false},{"from":{"line":0,"ch":105,"sticky":null},"to":{"line":0,"ch":111,"sticky":null},"value":"dateField_ksj7dsfg","invalid":false},{"from":{"line":0,"ch":125,"sticky":null},"to":{"line":0,"ch":131,"sticky":null},"value":"dateField_ksj7dsfe","invalid":false},{"from":{"line":0,"ch":145,"sticky":null},"to":{"line":0,"ch":151,"sticky":null},"value":"dateField_ksj7dsfg","invalid":false},{"from":{"line":0,"ch":163,"sticky":null},"to":{"line":0,"ch":169,"sticky":null},"value":"dateField_ksj7dsfe","invalid":false}],"isCmData":true}

计算工龄

宜搭为了更好的优化宜搭使用手册内容和质量,占用您3-5分钟时间,辛苦填写一下文档反馈问卷。文档反馈问卷是匿名提交,同时问卷信息仅用于宜搭文档体验反馈收集,感谢您对宜搭的支持!

点此填写调研问卷


--------------------获取宜搭最新信息,欢迎关注我们--------------------

Copyright © 2024钉钉(中国)信息技术有限公司和/或其关联公司浙ICP备18037475号-4