PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL: Abfrage über einen Bereich


mf_2
2013-09-04, 04:47:43
Hallo,
ich habe eine SQL-Tabelle mit Terminen. Diese sind mit start (date), ende (date) und name (varchar) gespeichert.
Nun möchte ich abfragen, ob es für eine bestimmte Spanne an jedem Tag der Spanne Termine gibt.
Beispielsweise vom 1.9. zum 10.9.
Da soll es für jeden Tag genau einen (oder wenigstens einen - je nachdem was abfragetechnisch einfacher ist) Eintrag geben und das möchte ich abfragen.
Aktuell frage ich das für jeden Tag der Spanne ab (also vom 1. bis zum 10.), aber ich würde das lieber in eine einzelne SQL-Abfrage packen (da das ja sicher performanter ist), komme aber nicht drauf wie ich das am besten formuliere.
Geht das überhaupt mit MySQL?
Gruß
mf_2

registrierter Gast
2013-09-04, 07:04:25
Das sollte machbar sein, wenn auch in gewisser Weise unschön.

Ungetestet:
SELECT cnt = DATEDIFF($begin, $end) FROM (SELECT count(*) AS cnt FROM (SELECT * FROM termine WHERE start_date >= $begin AND start_date <= $end GROUP BY date(start_date)) AS tmp1) AS tmp2

mf_2
2013-09-04, 13:30:13
Danke für die Antwort. Ich habe es mal mit einem Termin vom 1.8.2013 zum 30.09.2013 getestet und da liefert das für den Zeitraum 1.-10.9.2013 eine 0 zurück. Da trifft auch die Abfrage nicht zu, da die erwartet dass start innerhalb des abgefragten Zeitraums liegt.

registrierter Gast
2013-09-04, 16:25:52
Ach so. Dann hatte ich deine eingangs gewünschte Abfrage ohnehin falsch verstanden.

mf_2
2013-09-04, 16:36:58
Kein Problem.
Ich habe das Statement mal dahingehend erweitert, dass es auch reicht, dass start kleiner gleich dem $start-Datum ist und ende größer gleich $ende. Leider bringt mich das noch nicht weiter, da das ganze dann 1 zurückgibt (weil halt 1 Termin gefunden wurde).
Was auch gehen würde, wäre die Rückgabe der Anzahl Tage, für die in der geforderten Spanne ein Termin existiert.
Also wäre das in meinem Beispiel eine 10, da für alle Tage vom 1.9. bis zum 10.9. ein Termin existiert.

Haarmann
2013-09-05, 08:30:05
mf_2

Gibt es Termine mit einem Bereich über 24h?

mf_2
2013-09-05, 08:32:27
Ja, die Termine können eine beliebige Dauer (in ganzen Tagen) haben.

MooN
2013-09-05, 09:24:36
Du möchtest doch als Ergebnis eine Tabelle, die für jeden Tag deiner genannten Zeitspanne die Anzahl der diesen Tag beinhaltenden Termine nennt, oder?

Dann solltest du damit doch ziemlich gut hinkommen:
SELECT start_date, COUNT(name) FROM termine WHERE (start_date BETWEEN $timespan_begin AND $timespan_end) OR (end_date BETWEEN $timespan_begin AND $timespan_end) GROUP BY start_date

Falls nicht, dann beschreibe doch bitte nochmal wie genau das Resultat der Query aussehen sollte.

mf_2
2013-09-06, 11:05:04
Als Ergebnis möchte ich wissen ob es für jeden Tag der geforderten Spanne Termine gibt oder nicht. Wie viele Termine ist dabei erstmal egal.
Ich könnte auch damit leben (wenn es einfacher ist), dass mir die Anzahl der Tage der Spanne zurückgegeben werden, für die es Termine (oder keine Termine?) gibt. Das kann ich ja dann im Programm immer noch gegen die Anzahl Tage der Spanne vergleichen und sehe dann ob es für alle Tage Termine gibt.