Sven Rautenberg: Problem mit SQL-Statement

Beitrag lesen

Moin!

*Freu* Ich glaub ich habs doch noch geschafft das Ganze im Select-Statement zu lösen. Vielleicht interessiert es ja jemanden:

SELECT * FROM tbl

WHERE
(start >= '2011-01-03 00:00:00' AND end <= '2011-01-09 23:59:59') OR
( start >=  DATE_ADD('2011-01-03 00:00:00', INTERVAL DATEDIFF(START ,END)DAY ) AND end <= '2011-01-09 23:59:59')


>   
> Ich ermittle also von mehrtägigen Terminen die länge in Tagen und ziehe diese vom eigentlichen Start-Zeitraum ab (genauer gesagt addiere ich einen negativen Wert). Ist zwar jetzt noch nicht 100% ausformuliert aber grundsätzlich sollte das funktionieren.  
  
Was ist mit Martins Lösung?  
  
Dein Sichtfenster soll alle Termine anzeigen, die innerhalb des Zeitraums "wirken".  
  
Das sind Termine, deren Start nach dem Beginn und deren Enddatum vor dem Ende des Fensters liegen.  
Das sind Termine, deren Start vor dem Beginn und deren Enddatum vor dem Ende des Fenster liegen.  
Das sind Termine, deren Start nach dem Beginn und deren Enddatum nach dem Ende des Fenster liegen.  
Das sind Termine, deren Start vor dem Beginn und deren Enddatum nach dem Ende des Fensters liegen.  
  
Das wären vier Bedingungen. Die kann man allerdings umformulieren, wie Martin es getan hat. Denn offenbar hat der Beginn für den Start eines Termins keine wirkliche Auswirkung, weil die Bedingung "vor" oder "nach" dem Beginn sein kann, in Abhängigkeit vom Enddatum, und umgekehrt.  
  
Relevant für's Anzeigefenster sind ja alle Termine, die schon angefangen haben, bevor das Fenster endet, aber noch nicht geendet sind, bevor das Fenster überhaupt begonnen hat.  
  
Das kann man auch beweisen, indem man die vier Bedingungen von oben umformuliert.  
Zunächst mal gilt: Beginn < Ende  
Und als Ungleichheitsketten formuliert gilt für die Daten bei den oberen vier Bedingungen:  
  
Beginn < Startdatum < Enddatum < Ende  
Startdatum < Beginn < Enddatum < Ende  
Beginn < Startdatum < Ende < Enddatum  
Startdatum < Beginn < Ende < Enddatum  
  
Anhand dieser Schematik kann man erkennen, dass "Startdatum" sich immer vor "Ende" vom Fenster befindet, und "Enddatum" sich immer hinter dem "Beginn" befindet.  
  
  
 - Sven Rautenberg