Hallo, Danke euch beiden!
@GTA: Horst_H hat recht, es ist etwas anderes gemeint.
@Horst_H:
Es gilt lediglich 2 Intervalle zu betrachten (zum Glück), allerdings kann deren Anordnung völlig frei sein, ich versuch mal ASCII Art

:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Intevall I:
i1 |----------------------------| i2
m1 |------| m2 n1 |-----| n2
o1 |---..............................---| o2
p1 |.....| p2
q1 |------.....| q2 r1 |....----| r2
^^^^^^ mögliche intervall positionen des zweiten Intervalls (M,N,P,Q,R) ^^^^^^^^ |
Der gepunktete Bereich ist der Schnitt der Intervalle und die Länge davon möchte ich haben.
Ich habe mir mittlerweile eine funktion gezaubert, die das macht, wichtig ist dabei die Reihenfolge der Überprüfung, sonst gibts Probleme
hier die Funktion, für alle interessierten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| function GetIntersectPeriod(StartOfVoyage, IntervalStartDate, EndOfVoyage, IntervalEndDate: TDateTime) : Double; begin Result := 0; if (EndOfVoyage < IntervalStartDate) and (StartOfVoyage > IntervalEndDate) then Exit
else if (StartOfVoyage < IntervalStartDate) and (IntervalEndDate < EndOfVoyage) then Result := DaySpan(IntervalEndDate, IntervalStartDate)
else if (IntervalStartDate < StartOfVoyage) and (EndOfVoyage < IntervalEndDate) then Result := DaySpan(EndOfVoyage, StartOfVoyage)
else if (StartOfVoyage < IntervalStartDate) and (EndOfVoyage < IntervalEndDate) then Result := DaySpan(EndOfVoyage, IntervalStartDate)
else if (StartOfVoyage < IntervalEndDate) and (IntervalEndDate < EndOfVoyage) then Result := DaySpan(IntervalEndDate, StartOfVoyage);
end; |
Kann sein das da noch ein Denkfehler drin ist, aber das Prinzip sollte klar geworden sein.
Danke an alle und einen schönen, ruhigen und erfolgreichen Tag!
gruß,
schubser