Seite 1 von 1

Überschneidung von Zeiträumen

Verfasst: 10.01.2013 16:55
von ThoPie
Hallo Leute, ich brauche mal eure Hilfe

Ich habe bis jetzt diese Procedure zur Ermittlung von Überschneidungen von 2 Zeiträumen

Code: Alles auswählen

; Überprüfung auf Überschneidung von zwei Zeiträumen
; Eingangsparameter: BZR1 - Beginn des 1. Zeitraumes (JJJJ-MM-TT)
;                    EZR1 - Ende des 1. Zeitraumes (JJJJ-MM-TT), leer möglich
;                    BZR2 - Beginn des 2. Zeitraumes (JJJJ-MM-TT)
;                    EZR2 - Ende des 2. Zeitraumes (JJJJ-MM-TT), leer möglich
; Ausgangsparameter: 0 - es gibt keine Überschneidung
;                    1 - es gibt eine Überschneidung
Procedure.i HabenZeitraeumeUeberschneidung(BZR1.s,EZR1.s,BZR2.s,EZR2.s)
  If EZR1>"" And EZR2>""
    ; Zeitraum 1 in Zeitraum 2
    If (BZR1>=BZR2 And BZR1<=EZR2) Or (EZR1>=BZR2 And EZR1<=EZR2)
      ProcedureReturn 1
    EndIf
    ; Zeitraum 2 in Zeitraum 1
    If (BZR2>=BZR1 And BZR2<=EZR1) Or (EZR2>=BZR1 And EZR2<=EZR1)
      ProcedureReturn 1
    EndIf
  ElseIf EZR1="" And EZR2=""
    ; Zeitraum 1 und Zeitraum 2 haben offenes Ende
    ProcedureReturn 1
  ElseIf EZR1>"" And EZR2=""
    If BZR1>=BZR2 Or EZR1>=BZR2
      ProcedureReturn 1
    EndIf
  ElseIf EZR1="" And EZR2>""
    If BZR2>=BZR1 Or EZR2>=BZR1
      ProcedureReturn 1
    EndIf  
  EndIf
  ProcedureReturn 0
EndProcedure
Die Enden der Zeiträume können offen sein. Soweit funktioniert diese Prozedur auch. Nun muss ich die aber erweitern, so dass auch offene Beginnzeiträume zugelassen werden. Irgendwie komme ich da immer durcheinander und verstricke mich. Kann mir jemand dabei behilflich sein - vielleicht gehts ja auch viel einfacher.

Vielen Dank für eure Mühe.

Re: Überschneidung von Zeiträumen

Verfasst: 10.01.2013 17:15
von NicTheQuick
Du musst die Zeiträume ja nur nach Startzeit sortieren und dann schauen, ob der spätere Startzeitpunkt vor dem Ende des anderen liegt. Dann überschneiden sie sich.

Code: Alles auswählen

Überschneidung     keine Überschneidung

|––––––|           |––––––|
     |––––––|                 |––––––|

···––––|           ···––––|
     |––––––|                 |––––––|

···––––|           ···––––|
     |––––···                 |––––···
Falls beide keine Startzeit haben, überschneiden sie sich immer, wenn sie kein Ende haben, ebenfalls.

Code: Alles auswählen

···––––|
···–––––––––|

|–––––––––···
     |––––···
Falls der frühere Startzeitpunk kein Ende hat, überschneiden sie sich.

Code: Alles auswählen

|–––––––––···
     |––––···

|–––––––––···
     |––––––|

Re: Überschneidung von Zeiträumen

Verfasst: 10.01.2013 17:48
von STARGÅTE
Sowas habe ich ja noch nie gesehen: Ein größer-gleich-Vergleich mit String?
Ist das offiziell zugelassen?
Wie sind denn da die regeln? Scheinbar wird ein Zeichen-für-Zeichen-Ascii-Vergleich durchgeführt.

Auch wenn es nicht teil der Frage ist, aber ich würde hier lieber auf TimeStamps umsteigen, mit denen kann man dann auch leichter Rechnen (subtrahieren und addieren)

Re: Überschneidung von Zeiträumen

Verfasst: 10.01.2013 18:19
von 7x7
Die Logik ist eigentlich recht einfach.

Code: Alles auswählen

; Voraussetzung:
;Anfangs-und Endzeiten mit Date() in numerische Werte umwandeln
;leere Anfangszeiten auf (numerisch) Null setzen
;leere Endzeiten auf den Maximalwert von Date() setzen

Teil1:
;Aus der Sicht von Zeitfenster A gegen Zeitfenster B prüfen
If BZR1<=BZR2	
	If EZR1<=BZR2
		ProcedureReturn 0
	Else
		ProcedureReturn 1
	EndIf
EndIf

If BZR1=>EZR2
	ProcedureReturn 0
Else
	ProcedureReturn 1
EndIf


Teil2:
;Aus der Sicht von Zeitfenster B gegen Zeitfenster A prüfen
If BZR2<=BZR1	
	If EZR2<=BZR1
		ProcedureReturn 0
	Else
		ProcedureReturn 1
	EndIf
EndIf

If BZR2=>EZR1
	ProcedureReturn 0
Else
	ProcedureReturn 1
EndIf

Teil2 könnte man sich sparen, wenn man Zeitfenster A und Zeitfenster B "swapt" und Teil1 nochmal aufruft

(Code ist nicht getestet und ich setze voraus, dass wenn das Ende eines Zeitfensters mit dem Beginn des anderen Zeitfensters GLEICH ist, dass das KEINE Überschneidung bedeutet!)

Re: Überschneidung von Zeiträumen

Verfasst: 10.01.2013 19:24
von NicknameFJ
STARGÅTE hat geschrieben:(...) Ein größer-gleich-Vergleich mit String? Ist das offiziell zugelassen?
Wie sind denn da die regeln? Scheinbar wird ein Zeichen-für-Zeichen-Ascii-Vergleich durchgeführt.
Hallo Stargate,

ist in allen mir bekannten Basic-Dialekten eine dokumentierte Art Strings zu vergleichen.

ja, zeichenweiser - Ascii Vergleich:
also: "19" > "121" wird #true ergeben


Grüße

NicknameFJ

Re: Überschneidung von Zeiträumen

Verfasst: 10.01.2013 20:41
von ThoPie
Danke euch allen.
Habs jetzt so gemacht.

Code: Alles auswählen

; Überprüfung auf Überschneidung von zwei Zeiträumen
; Eingangsparameter: BZR1 - Beginn des 1. Zeitraumes (JJJJ-MM-TT), leer möglich
;                    EZR1 - Ende des 1. Zeitraumes (JJJJ-MM-TT), leer möglich
;                    BZR2 - Beginn des 2. Zeitraumes (JJJJ-MM-TT), leer möglich
;                    EZR2 - Ende des 2. Zeitraumes (JJJJ-MM-TT), leer möglich
; Ausgangsparameter: 0 - es gibt keine Überschneidung
;                    1 - es gibt eine Überschneidung
Procedure.i HabenZeitraeumeUeberschneidung(BZR1.s,EZR1.s,BZR2.s,EZR2.s)
  If (BZR1="" And BZR2="") Or (EZR1="" And EZR2="")
    ProcedureReturn 1  
  EndIf
  If BZR2<BZR1
    Swap BZR1,BZR2  
    Swap EZR1,EZR2 
  EndIf
  If EZR1=""
    ProcedureReturn 1
  EndIf
  If BZR2<=EZR1
    ProcedureReturn 1  
  EndIf
  ProcedureReturn 0
EndProcedure
Falls jemand noch Anmerkungen/Verbesserungen hat, bitte melden.
Danke nochmal