【问题标题】:Identifying dates that falls in the same month, day period across years识别同一个月内的日期,跨年的一天
【发布时间】:2017-06-19 09:49:09
【问题描述】:

所以我有一个完整的日期列表。我需要找出与我每年规定的“开始日期”和“结束日期”相同的日期范围(日和月)。

例如开始日期:2/12/2004,结束日期:31/1/2005,日期介于 2/12/2000 和 31/1/2001、2/12/2001 和 31/1/2002、2/12/ 2001 和 31/1/2002 等应标记为“有效”。

目前我使用上限/下限,然后测试日期是否在范围内。

Excel 公式:

上限:=DATE(YEAR(Date),MONTH(Test),DAY(Test)+回溯期)

下:=DATE(YEAR(Date),MONTH(Test),DAY(Test)-回溯期)

有效:=IF(AND(Date=Lower),1,0)

Test                    1/1/2005
Look Back Period (Days) 30
Start Date              2/12/2004 (=Test + Look Back Period)
End Date                31/1/2005 (=Test - Look Back Period)


    Date        Upper       Lower       Valid
    04/01/2000  31/1/2000   2/12/1999   1
    05/01/2000  31/1/2000   2/12/1999   1
    06/01/2000  31/1/2000   2/12/1999   1
    07/01/2000  31/1/2000   2/12/1999   1
    10/01/2000  31/1/2000   2/12/1999   1
    11/01/2000  31/1/2000   2/12/1999   1
    12/01/2000  31/1/2000   2/12/1999   1
    13/01/2000  31/1/2000   2/12/1999   1
    14/01/2000  31/1/2000   2/12/1999   1
    17/01/2000  31/1/2000   2/12/1999   1
    18/01/2000  31/1/2000   2/12/1999   1
    19/01/2000  31/1/2000   2/12/1999   1
    20/01/2000  31/1/2000   2/12/1999   1
    21/01/2000  31/1/2000   2/12/1999   1
    24/01/2000  31/1/2000   2/12/1999   1
    25/01/2000  31/1/2000   2/12/1999   1
    26/01/2000  31/1/2000   2/12/1999   1
    27/01/2000  31/1/2000   2/12/1999   1
    28/01/2000  31/1/2000   2/12/1999   1
    31/01/2000  31/1/2000   2/12/1999   1
    01/02/2000  31/1/2000   2/12/1999   0
    02/02/2000  31/1/2000   2/12/1999   0
    03/02/2000  31/1/2000   2/12/1999   0
    04/02/2000  31/1/2000   2/12/1999   0
    07/02/2000  31/1/2000   2/12/1999   0
    .
    .
    .
    30/11/2000  31/1/2000   2/12/1999   0
    01/12/2000  31/1/2000   2/12/1999   0
    04/12/2000  31/1/2000   2/12/1999   0 <-- :(
    05/12/2000  31/1/2000   2/12/1999   0 <-- :(
    06/12/2000  31/1/2000   2/12/1999   0 <-- :(
    07/12/2000  31/1/2000   2/12/1999   0 <-- :(
    08/12/2000  31/1/2000   2/12/1999   0 <-- :(
    11/12/2000  31/1/2000   2/12/1999   0 <-- :(
    12/12/2000  31/1/2000   2/12/1999   0 <-- :(
    13/12/2000  31/1/2000   2/12/1999   0 <-- :(
    14/12/2000  31/1/2000   2/12/1999   0 <-- :(
    15/12/2000  31/1/2000   2/12/1999   0 <-- :(
    18/12/2000  31/1/2000   2/12/1999   0 <-- :(
    19/12/2000  31/1/2000   2/12/1999   0 <-- :(
    20/12/2000  31/1/2000   2/12/1999   0 <-- :(
    21/12/2000  31/1/2000   2/12/1999   0 <-- :(
    22/12/2000  31/1/2000   2/12/1999   0 <-- :(
    25/12/2000  31/1/2000   2/12/1999   0 <-- :(
    26/12/2000  31/1/2000   2/12/1999   0 <-- :(
    27/12/2000  31/1/2000   2/12/1999   0 <-- :(
    28/12/2000  31/1/2000   2/12/1999   0 <-- :(
    29/12/2000  31/1/2000   2/12/1999   0 <-- :(
    01/01/2001  31/1/2001   2/12/2000   1
    02/01/2001  31/1/2001   2/12/2000   1
    03/01/2001  31/1/2001   2/12/2000   1
    04/01/2001  31/1/2001   2/12/2000   1
    05/01/2001  31/1/2001   2/12/2000   1
    08/01/2001  31/1/2001   2/12/2000   1
    09/01/2001  31/1/2001   2/12/2000   1
    10/01/2001  31/1/2001   2/12/2000   1
    11/01/2001  31/1/2001   2/12/2000   1

只要期间不跨越年份,该公式就可以正常工作。但是,如果上限和下限在 2 个不同年份之间交叉,则有效公式将排除前一年的值。

有什么解决办法吗?

【问题讨论】:

  • 这看起来像是段树的一个很好的例子。 en.wikipedia.org/wiki/Segment_tree你熟悉算法和VBA吗?
  • 是的。我可以用 vba 编写解决方案。但是,为了这张表的遗留问题(这很可能不会传给其他人),我更喜欢 Excel 公式解决方案。
  • 你能给我们举一个不工作的例子吗?

标签: excel excel-formula


【解决方案1】:

要使用公式执行此操作,请再设置两个帮助列

lower1: =DATE(YEAR(Date)-1,MONTH(StartDate),DAY(StartDate))
upper1: =C8+2*LookBack
Lower2: =DATE(YEAR(Date),MONTH(StartDate),DAY(StartDate))
Upper2: =Lower2+2*LookBack

valid:  =IF(OR(AND(Date>=lower1,Date<=upper1),AND(Date>=Lower2,Date<=Upper2)),1,0)

我们所做的只是设置两组边界。相对Date,一个从上一年开始;另一个从当前年份开始。然后检查Date,看看它是否属于任一集合。

对于外观,不要求边界列可见,甚至不要求它们与 Datevalid 列连续。

【讨论】:

  • 我正在研究一个不使用额外辅助列的公式(我经常把它当作一个挑战:P),但是这个解决方案的 +1 非常简洁,我喜欢它的事实易读易懂:)
  • @A.S.H 谢谢。我认为他既想要一个 Excel 解决方案并将其传递给其他人这一事实有利于可读性与紧凑性。
  • 使用辅助列并不丢人。事实上,在大多数项目中,我更喜欢人们使用辅助列,因为它使以后的故障排除、解释、审计和调试变得更加容易。超级公式在所有这些方面都很糟糕。
  • 非常感谢!您的解决方案完美运行!我也倾向于将所有内容都压缩到一个公式中,但在这种情况下,我想我只是把自己弄糊涂了。也没有考虑为上一年添加一个额外的参数。很好的解决方案! @RonRosenfeld
  • @RonRosenfeld 做了一个小改动。你的上下公式有点混淆。干杯!
猜你喜欢
  • 2012-08-10
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多