【发布时间】: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