Angenommen, wir haben Bereiche, die durch DateTime-Variablen StartDate1
bis EndDate1
und StartDate2
bis EndDate2
bezeichnet sind.
Ich würde (left < value && value < right) || (right < value && value < left) für diese Methode bevorzugen.
Angenommen, wir haben Bereiche, die durch DateTime-Variablen StartDate1
bis EndDate1
und StartDate2
bis EndDate2
bezeichnet sind.
Ich würde (left < value && value < right) || (right < value && value < left) für diese Methode bevorzugen.
Warum würdest du vier Bedingungen überprüfen, wenn du nur zwei überprüfen musst? Scheitern.
Die hier veröffentlichte Lösung funktionierte nicht für alle überlappenden Bereiche...
\----------------------|-------A-------|----------------------
|----B1----|
|----B2----|
|----B3----|
|----------B4----------|
|----------------B5----------------|
|----B6----|
----------------------|-------A-------|----------------------
|------B7-------|
|----------B8-----------|
|----B9----|
|----B10-----|
|--------B11--------|
|----B12----|
|----B13----|
----------------------|-------A-------|----------------------
Meine Lösung war:
AND (
('start\_date' BETWEEN STARTDATE AND ENDDATE) -- berücksichtigt innere und äußere Startdaten
OR
('end\_date' BETWEEN STARTDATE AND ENDDATE) -- berücksichtigt innere und äußere Enddaten
OR
(STARTDATE BETWEEN 'start\_date' AND 'end\_date') -- nur für äußere Bereiche nötig, in denen die Daten drin liegen.
)
Da es mehrere Antworten für verschiedene Sprachen und Umgebungen gab, hier ist eine für standard ANSI SQL.
In Standard-SQL ist es so einfach wie
(StartDate1, EndDate1) überschneidet sich (StartDate2, EndDate2)
vorausgesetzt, alle vier Spalten sind DATE
oder TIMESTAMP
Spalten. Es gibt true zurück, wenn beide Bereiche mindestens einen Tag gemeinsam haben (unter der Annahme von DATE
Werten)
(Nicht alle DBMS-Produkte unterstützen das)
In PostgreSQL ist es auch einfach, die Einbeziehung zu testen, indem man Datumsbereiche verwendet
daterange(StartDate1, EndDate1) @> daterange(StartDate2, EndDate2)
das obige gibt true zurück, wenn der zweite Bereich vollständig im ersten enthalten ist (was sich von "überschneiden" unterscheidet)
Dies ist eine Erweiterung der ausgezeichneten Antwort von @charles-bretana.
Die Antwort macht jedoch keinen Unterschied zwischen offenen, geschlossenen und halboffenen (oder halbgeschlossenen) Intervallen.
Fall 1: A, B sind geschlossene Intervalle
A = [StartA, EndA]
B = [StartB, EndB]
[---- DateRange A ------] (True, wenn StartA > EndB)
[--- Date Range B -----]
[---- DateRange A -----] (True, wenn EndA < StartB)
[--- Date Range B ----]
Überschneidung, wenn: (StartA <= EndB) und (EndA >= StartB)
Fall 2: A, B sind offene Intervalle
A = (StartA, EndA)
B = (StartB, EndB)
(---- DateRange A ------) (True, wenn StartA >= EndB)
(--- Date Range B -----)
(---- DateRange A -----) (True, wenn EndA <= StartB)
(--- Date Range B ----)
Überschneidung, wenn: (StartA < EndB) und (EndA > StartB)
Fall 3: A, B rechts offen
A = [StartA, EndA)
B = [StartB, EndB)
[---- DateRange A ------) (True, wenn StartA >= EndB)
[--- Date Range B -----)
[---- DateRange A -----) (True, wenn EndA <= StartB)
[--- Date Range B ----)
Überschneidungsbedingung: (StartA < EndB) und (EndA > StartB)
Fall 4: A, B links offen
A = (StartA, EndA]
B = (StartB, EndB]
(---- DateRange A ------] (True, wenn StartA >= EndB)
(--- Date Range B -----]
(---- DateRange A -----] (True, wenn EndA <= StartB)
(--- Date Range B ----]
Überschneidungsbedingung: (StartA < EndB) und (EndA > StartB)
Fall 5: A rechts offen, B geschlossen
A = [StartA, EndA)
B = [StartB, EndB]
[---- DateRange A ------) (True, wenn StartA > EndB)
[--- Date Range B -----]
[---- DateRange A -----) (True, wenn EndA <= StartB)
[--- Date Range B ----]
Überschneidungsbedingung: (StartA <= EndB) und (EndA > StartB)
usw...
Zuletzt ist die allgemeine Bedingung für zwei Intervalle, sich zu überschneiden,
(StartA < EndB) und (EndA > StartB)
wobei eine strenge Ungleichung in eine nicht strenge umwandelt, wann immer der Vergleich zwischen zwei eingeschlossenen Endpunkten gemacht wird.
Dies, aber so ausführlich wie Jonathans Lefflers Antwort wäre das, was ich als akzeptierte Antwort auf die Frage des OPs im Sinn hatte.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
3 Stimmen
Äußerst ähnlich wie stackoverflow.com/questions/306316/…
1 Stimmen
@CharlesBretana Vielen Dank dafür, du hast Recht - das ist fast wie eine zweidimensionale Version meiner Frage!
2 Stimmen
Sehr ähnlich wie stackoverflow.com/questions/117962/…
2 Stimmen
Teile die Situation "Die beiden Datumsbereiche überschneiden sich" in Fälle (es gibt zwei) und teste dann jeweils für jeden Fall.
0 Stimmen
Ich weiß, dass dies als sprachunabhängig markiert wurde, aber für alle, die in Java implementieren: Erfinden Sie das Rad nicht neu und verwenden Sie Joda Time. joda-time.sourceforge.net/api-release/org/joda/time/base/…
0 Stimmen
Wenn Daten NULL-Werte (oder leer) sein können, wenn sie nicht festgelegt sind, gibt es diese Frage, die eine Erweiterung dieser ist.
0 Stimmen
Algorithmus zum Zusammenführen überlappender Intervalle kann einige Hinweise geben.
1 Stimmen
Hallo.. A: StartDate1, B: EndDate1, C: StartDate2, D: EndDate2. Wenn B < C oder A > D, dann nehmen wir an, dass sie sich nicht überschneiden.. Also können wir einfach mit "isintersects = not (B < C oder A > D)" testen, ob es sich überschneidet oder nicht.
0 Stimmen
Noch ein Intervallhilfsprogramm für .Net github.com/AlexeyBoiko/IntervalUtility (Ich bin der Autor)