作者JieJuen (David)
看板Office
标题Re: [算表] EXCEL日期计算问题
时间Mon Nov 5 15:48:27 2007
想得到某期间过了几年几月几日
其实是很复杂的问题
因为这是人们一般不很精确的说法
同样的几年几月几日,开始或结束的日期不同,
经历的时间就不同,不是单纯把月份、日数取出来加加减减就好
直接看难一点的例子
从今天2007/11/5到上个闰年的前一天2004/2/28
经过了几年几月几日?
首先,人算的过程是
2/28比11/5还早
因此2007-2004=3年
28日比5日还晚
因此10月-2月=8月
日期28到隔月5日
因为已经算出经过了3年8个月
所以日期部分
应该用2007/10/28~2007/11/5来算
故为8日
因此答案为:3年8月8日
这是很奇怪的
如果2007/2/28~2007/3/5
应该是只隔5日
2004/2/28~2004/3/5
则隔6日
但是我们要的答案却是8日
可见这种说法多不精确!
所以如果要把日、月取出来算的话
条件要设很多
把人算的思路都写进去
有点麻烦!
假设是闰年当天,也就是
2004/2/29~2007/11/5
就更好笑了~
3年还是没问题
月分就要由2007/2/29~2007/11/5决定
但是2007年2月没有29日!
2/28日刚刚算过了
现在晚了一天
只好当3/1来算了
也就是
2004/2/29~2007/3/1
2004/3/1~2007/3/1
都说过了整整3年~
回到题目,
现在算到经过3年
考虑2007/3/1~2007/11/5
1日早於5日
月份=11-3=8
麻烦的还没结束!!
开始算日,
目前已得经过3年8个月
因为2004/2/29加上3年8个月
日期是2007/10/29!!
有29日了!
於是乎
2007/10/29~2007/11/5
经过了7日
答案是3年8个月又7天
结果看起来很正常
晚一天开始,经过的期间少1天
虽然计算的过程无比的艰辛!
然而,当问题变回正常时,
也就是请问2004/3/1~2007/11/5
完全没有异议的答案:3年8个月又4天
却让人觉得,这到底正不正确?
那2天,就这样消失了....(7天少一天应是6天,那2天消失在10/30.10/31)
也难怪,
没有人想回答这个问题,
想了就头痛.
不过,人们的这种说法还是存在的,
最糟也就差个3天左右,(没有闰年时)
取得大略的时间概念时仍非常有用,
也难怪想要用excel算了。
还好,excel还真的有这种稀奇古怪的函数,
完全遵照人们的算法
2004/3/1 写於A1
2007/11/5 写於A2
年=DATEDIF($A$1,$A$2,"y")
月=DATEDIF($A$1,$A$2,"ym")
日=DATEDIF($A$1,$A$2,"md")
它是采用"移动"的概念
年数最好算,算"整年数"
月数,移动年,也就是移到今年或去年来算
日数,移动年与月,
也就是移到上个月或本月来算.
这就是所需的函数了(...呼~好累)
完全符合以上人算的结果。
但是这样的时间间隔不太精确,
也许是因为这样的原因(纯属臆测),
EXCEL的说明里没有(XP中).
各位可自行GOOGLE
http://www.officefans.net/cdb/viewthread.php?tid=82354
(以下为截取) (应为早些时期的说明档)
------------------------------------------
语法
DATEDIF(start_date,end_date,unit)
Start_date 为一个日期,它代表时间段内的第一个日期或起始日期。日期有多种输入方
法:带引号的文本串(例如 "2001/1/30")、系列数(例如,如果使用 1900 日期系统则
36921 代表 2001 年 1 月 30 日)或其他公式或函数的结果(例如,
DATEVALUE("2001/1/30"))。有关日期系列数的详细信息,请参阅 NOW。
End_date 为一个日期,它代表时间段内的最後一个日期或结束日期。
Unit 为所需信息的返回类型。
Unit 返回
"Y" 时间段中的整年数。
"M" 时间段中的整月数。
"D" 时间段中的天数。
"MD" start_date 与 end_date 日期中天数的差。忽略日期中的月和年。
"YM" start_date 与 end_date 日期中月数的差。忽略日期中的日和年。
"YD" start_date 与 end_date 日期中天数的差。忽略日期中的年。
-------------------------------------------
该来源写"忽略"一词感觉容易误会
例如其中"YM"该来源写忽略日期中的日和年。
如果是这样,似乎就跟用MONTH取出相减没两量,
测试结果,是会考虑到日的,
因此改称"移动"或是什麽词可能更好。
它的参数也是有逻辑的
一定照Y M D的顺序排
第一位是以什麽单位(unit)移动,第二位是计算什麽。
都移动到上个月或本月了年当然也已移动,故"MD"移动月和年。
该网页也有另一个流传开来的EXCEL隐藏函数,供参考。
------------------------------------------------------------------
NUMBERSTRING
EXCEL中隐藏了一个数字转大写的函数NUMBERSTRING,但它仅支持正整数,用中文版的朋
友可以试试这个函数:
=NUMBERSTRING(VALUE,TYPE)
NumberString(1234567890,1) = 一十二亿三千四百五十六万七千八百九十
NumberString(1234567890,2) = 壹拾贰亿参仟肆佰伍拾陆万柒仟捌佰玖拾
NumberString(1234567890,3) = 一二三四五六七八九○
------------------------------------------------------------------
※ 引述《ihsakat (Victor)》之铭言:
: 软体:Office EXCEL
: 版本:2003
: 两日期相减 用今天的日期-某日期(B:B)
: =TEXT(TODAY()-B:B,"yy年mm月dd日")
: 想要得到期间过了几年几月几日
: 结果居然会多一个月..囧
: 我用today()-2007/5/5 结果是一个月
: 请求高手解答 感恩
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.123.42.89
※ 编辑: JieJuen 来自: 218.164.50.116 (11/05 18:43)
1F:推 websterskimo:上面算日期的问题也是困扰我满久的 11/06 09:05
2F:→ websterskimo:虽然还没有办法马上吸收..还是感谢你的分享喽 11/06 09:05
3F:→ websterskimo:底下转国字的字法真的很不错.. 11/06 09:06
4F:→ websterskimo:先前当参一时有用一些方法去写..但比较没效率 11/06 09:07
5F:推 JieJuen:也感谢你的回应罗^^ 11/06 11:24
※ 编辑: JieJuen 来自: 218.164.49.60 (11/27 16:44)