【问题标题】:Date logic in Excel 2013Excel 2013 中的日期逻辑
【发布时间】:2016-02-08 15:00:32
【问题描述】:

以下公式适用于大多数日期组合:

=IF(INT(B2)=INT(NOW()),"Today",IF(DAYS(NOW(),B2)>365,IF(DAYS(NOW(),B2)/365.25>1,YEAR(NOW())-YEAR(B2),0)&" years, ","")&IF(IF(MONTH(NOW())-MONTH(B2)<0,MONTH(NOW())-(MONTH(B2)-11),IF(DAYS(NOW(),B2)<28,0,MONTH(NOW())-MONTH(B2)))=0,"",IF(MONTH(NOW())-MONTH(B2)<0,MONTH(NOW())-(MONTH(B2)-11),IF(DAYS(NOW(),B2)<28,0,MONTH(NOW())-MONTH(B2)))&" months and ")&IF(DAY(NOW())-DAY(B2)<0,VLOOKUP(MONTH(B2),{1,31;2,28;3,31;4,30;5,31;6,30;7,31;8,31;9,30;10,31;11,30;12,31},2)-DAY(B2)+DAY(NOW()),DAY(NOW())-DAY(B2))&" days")

除非 B2 是 16/02/2015 15:19:00 并且 NOW() 是 08/02/2016 14:54,其中结果是 20 天,但显然应该是 11 个月零 30 天。 我正在努力寻找我的逻辑漏洞。

【问题讨论】:

  • 这个公式试图做什么?
  • 这是一个日期比较。如果 B2 是 15/07/2014,它将返回 2 年 6 个月 24 天。如果 B2 是 07/05/2015,它将返回 8 个月零 1 天。如果 B2 是 03/02/2016,它将返回 5 天

标签: excel excel-formula


【解决方案1】:

您的函数似乎使用儒略年长度,而不是更复杂的公历。这就是为什么您的函数的稳健性会受到质疑的原因之一。

幸运的是,Excel 有一个内置函数DATEDIF,您可以使用它。但是,由于某种原因,它是一个隐藏功能! (我完全不知道为什么)。

如果 A1 和 A2 包含两个日期,则使用

=DATEDIF(A1,A2,"y") &amp; " years, " &amp; DATEDIF(A1,A2,"ym") &amp; " months, " &amp; DATEDIF(A1,A2,"md") &amp; " days"

A1 必须早于 A2。

【讨论】:

  • 最后一部分似乎对我做了一些奇怪的事情,例如如果你尝试 A1=31/1/15 和 A2=1/3/16 你会得到 -1 吗?
  • 我看到其他使用 DATEDIF 的回复,但假设它在 2013 年不可用,因为它不在功能列表中:s 谢谢@Bathsheba
  • 它是 - 但由于某种原因被隐藏了。 @TomSharpe:当我下次在办公室时,我会检查那个角落案例。
  • 谢谢!老实说,当上个月(二月)“没有足够的日子”时,很难知道答案应该是什么。
  • 嗯,2014 年 11 月 30 日和 16 年 1 月 1 日的结果更奇怪
【解决方案2】:

由于 DATEDIF(date1,date2,"md") 本质上是在生成随机数时

DAY(dates2)<DAY(date1)

这是一个可能的公式解决方案(我的开始和结束日期在 A2 和 B2 中):-

=DATEDIF(A2,B2,"y")

=DATEDIF(A2,B2,"m")

=IF(DAY(B2)>=DAY(A2),DAY(B2)-DAY(A2),DAY(B2)-DAY(A2)+DAY(EOMONTH(A2,0)))

这里有几个测试用例:-

【讨论】:

  • 确实如此,注意我在回答中声明“A1 必须早于 A2”。你的方法看起来很有希望。加一。 (顺便说一句,如果您不接受我的回答并接受您自己的回答,完全不会感到难过。看来您的解决方案将对未来的用户更有用,这就是本网站的全部意义所在)。
  • 感谢您的积极评论(我没有发表原始帖子,但被吸引了:-))
【解决方案3】:

对于其他想要这样做的人,这是我的工作功能:

=IF(DAYS(NOW(),B2)>0,CONCATENATE(IF(DATEDIF(B2,NOW(),"y")=0,"",DATEDIF(B2,NOW(),"y")),IF(DATEDIF(B2,NOW(),"y")=0,"", " year"),IF(DATEDIF(B2,NOW(),"y")>1,"s",""),IF(AND(DATEDIF(B2,NOW(),"y")>0,DATEDIF(B2,NOW(),"ym")>0),IF(IF(AND(DATEDIF(B2,NOW(),"md")>0,OR(DATEDIF(B2,NOW(),"y")>0,DATEDIF(B2,NOW(),"ym")>0))," and ","")=""," and ",", "),""),IF(DATEDIF(B2,NOW(),"ym")=0,"",DATEDIF(B2,NOW(),"ym")),IF(DATEDIF(B2,NOW(),"ym")=0,"", " month"),IF(DATEDIF(B2,NOW(),"ym")>1,"s",""),IF(AND(DATEDIF(B2,NOW(),"md")>0,OR(DATEDIF(B2,NOW(),"y")>0,DATEDIF(B2,NOW(),"ym")>0))," and ",""),IF(DATEDIF(B2,NOW(),"md")=0,"",DATEDIF(B2,NOW(),"md")),IF(DATEDIF(B2,NOW(),"md")=0,"", " day"),IF(DATEDIF(B2,NOW(),"md")>1,"s","")),"Less than a day")

给出的结果类似于“1 年 5 个月 15 天”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多