【发布时间】:2020-06-22 12:56:04
【问题描述】:
假设我们有两个日期间隔:
A-------------B
C-------------------------D
其中A 和C 是开始日期,B 和D 是日期间隔AB 和CD 的结束日期。
我发现如果(B+D)>=(A+C) 我们有日期重叠。但是如果(B+D)<(A+C),我们没有日期重叠。
我一直在寻找的东西,但没有成功,它找出了一个通用算法,该算法将日期间隔AB 的拆分集返回给我。在上述情况下,AB 的拆分集将是:
A----------(C-1) 'I mean, begining date of interval CD diminished by one day
C----------B 'The actual date overlapping
我不是在寻找一种可以测试所有可能情况的算法,而是一种适用于任何情况的通用算法。
这个算法存在吗?我真的很感激任何帮助!!!
我能弄清楚的所有情况是(但我不确定是否是其他情况):
A---------------B
C--------------------D
A---------------B
C--------------------D
A---------------B
C------D
A------B
C---------------D
A---------------B
C---------------D
A--------B
C--------------D
A--------------B
C---------D
A--------------B
C-------D
A-------B
C--------------D
编辑
根据 Gary 的学生出色的选择答案,我能够弄清楚我需要的功能,如下所示。我不需要知道结果 inverval 的拆分集中的哪一个区间是重叠的,但是通过函数的一些更改,这很容易实现。
Sub Test()
arr = fSplitOverlap( _
DateSerial(2020, 3, 1), DateSerial(2020, 3, 31), _
DateSerial(2020, 3, 1), DateSerial(2020, 3, 10))
For i = LBound(arr) To UBound(arr) Step 2
Debug.Print arr(i), arr(i + 1)
Next i
End Sub
Function fSplitOverlap(ByVal Di1 As Date, ByVal Df1 As Date, _
ByVal Di2 As Date, ByVal Df2 As Date) As Variant
Dim arr() As Date
Dim DiOver As Date, DfOver As Date
Dim HaveFirsDisjoint1 As Boolean: HaveFirsDisjoint1 = False
DiOver = Application.WorksheetFunction.Max(Di1, Di2)
DfOver = Application.WorksheetFunction.Min(Df1, Df2)
'TEST OVERLAP
If DateDiff("d", DiOver, DfOver) >= 0 Then
'TEST FIRST POSSIBLE DISJOINT INVERVAL
If DateDiff("d", Di1, DateAdd("d", -1, DiOver)) >= 0 Then
ReDim Preserve arr(1 To 4)
arr(1) = Di1
arr(2) = DateAdd("d", -1, DiOver)
arr(3) = DiOver
arr(4) = DfOver
HaveFirsDisjoint1 = True
End If
'TEST SECOND POSSIBLE DISJOINT INVERVAL
If DateDiff("d", DateAdd("d", 1, DfOver), Df1) >= 0 Then
If HaveFirsDisjoint1 = True Then
ReDim Preserve arr(1 To 6)
arr(1) = Di1
arr(2) = DateAdd("d", -1, DiOver)
arr(3) = DiOver
arr(4) = DfOver
arr(5) = DateAdd("d", 1, DfOver)
arr(6) = Df1
Else
ReDim Preserve arr(1 To 4)
arr(1) = DiOver
arr(2) = DfOver
arr(3) = DateAdd("d", 1, DfOver)
arr(4) = Df1
End If
End If
End If
fSplitOverlap = arr
End Function
【问题讨论】:
-
您说您不想测试“所有可能的情况”,但您需要处理“任何情况”。有什么区别?
-
你好@TimWilliams!我不知道如何用英语更好地表达自己,但我一直在寻找由所选答案提供的普遍推理,而不是逐一检查我列出的每个可能案例,以及未列出的其他可能案例。
标签: excel vba algorithm date data-structures