今天帮用户处理了一个excel日期相减的问题,委实折腾了我一个来小时,这里由衷的感叹微软Excel的强大,同时又想臭骂微软的顽疾(中看不中用)。
问题描述如下:
A | B | C | D | E |
20100101 | 20090912 | 2010/1/1 | 2009/9/12 | 111 |
20100101 | 20090914 | 2010/1/1 | 2009/9/14 | 109 |
20090823 | 20100101 | 2009/8/23 | 2010/1/1 | -131 |
20091104 | 20100101 | 2009/11/4 | 2010/1/1 | -58 |
20100102 | 20090818 | 2010/1/2 | 2009/8/18 | 137 |
20100102 | 20091205 | 2010/1/2 | 2009/12/5 | 28 |
20100102 | 20090412 | 2010/1/2 | 2009/4/12 | 265 |
A列和B列存放的是日期格式化成年、月、日的值,用户希望得到A列和B列的日期相差几天。看上去很简单,用excel自带的DATEDIF(start_date,end_date,unit) 函数相减一下即可,其实不然。
解决:
1)由于datedif只能处理日期值,或者类似2010/12/13等字串,而20101213,其无法处理,同时为了让用户更好明白日期差是如何得到,于是新增C、D列分别存放A、B转换后的日期值,转换公式为
C2=DATE(MID(A2,1,4),MID(A2,5,2),MID(A2,7,2))
2)datedif函数处理
原以为通过函数datedif(start_date,end_date,”d”)即可得到两个日期的天数之差,可是当end_date小于start_date时,该函数执行就出错了,真是对微软这种中看不中用的做法深恶痛绝呀。幸好的是,我们可以先比较start_date,end_date大小,然后交换start_date,end_date的顺序即可。
新增E列,存放C、D列日期的天数之差,计算公式如下:
E2=IF(C2>D2,1,-1)*IF(C2>D2,DATEDIF(D2,C2,"d"),DATEDIF(C2,D2,"d"))