Hallo Jörg,
Nur ist es natürlich so, dass man nicht jedes Thema der Entwicklung zuerst einmal ins Forum einbringt, sondern man fängt an und stösst ggf. auf ein Problem, wo man nicht weiter kommt.
Ja, ich weiß schon. Das klassische XY-Problem. X ist zu lösen, man hat ein Detailproblem Y und sucht dafür nach Hilfe. Dabei könnte man Y ganz vermeiden.
Ich würde es vermutlich mit zwei Queries lösen und für den User die Stundensätze im gewünschten Datumsintervall lesen sowie die Sondersätze, deren Start/End Intervall das gewünschte Datumsintervall überschneidet. Die Tabelle "mein" haben wir aus dem Auge verloren, die schreib ich jetzt einfach mal dazu und hoffe, dass sie keine zusätzliche Komplikation bringt.
SELECT datum, std, bla1, bla2
FROM stunden std
LEFT JOIN
tabelle_mein m ON std.MID = m.MID
WHERE user = $user AND datum BETWEEN $von AND $bis
ORDER BY datum
SELECT start, end, blub1, blub2
FROM sonder s
WHERE user = $user AND start <= $bis AND end >= $von
ORDER BY datum
Zur Erklärung der "Überschneiden sich die Intervalle" Abfrage: Es gibt 6 mögliche Lagen von start/end und von/bis. Wenn man genau hinguckt, ist es dann "bad", wenn start > bis ODER end < von. Invertiert man das, ergibt sich mit der De Morgan Regel die obige Abfrage.
start <= end < von <= bis bad
start <= von <= end <= bis good
start <= von <= bis < end good
von < start <= end <= bis good
von < start <= bis < end good
von < <= bis < start <= end bad
Im Ergebnis hast Du zwei Arrays. Eins mit den Stunden pro Tag, eins mit den Sonder-Intervallen für den gewünschten Zeitraum. Die Datumsangaben stehen da - meine ich - im Format yyyy-mm-dd drin.
Das Problem, wie man das darstellen muss, ist mir unklar. Das ist deine Fachlichkeit.
Aber grundsätzlich würde ich nun die Datümer im PHP generieren, und nicht in der DB.
$datum = new DateTime($_POST['von']);
$bis = new DateTime($_POST['bis']);
$einTag = new DateTimeInterval("P1D");
while ($datum < $bis) {
$cDatum = $datum->format("Y-m-d");
// Verarbeitung
$datum->add($einTag);
}
Ob das mit dem new DateTime so einfach ist, hängt von dem Format ab, in dem Du das Datum vom Client bekommst. Ggf. musst Du DateTime::createFromFormat
verwenden.
Wie die Verarbeitung aussieht, hängt nun von deiner Fachlichkeit ab. Wenn Du pro Datum über die Vorgänge gruppieren willst, müsstest Du die nun herausfinden. Und dann pro Vorgang die Ausgaben durchführen. Dazu suchst Du Dir die entsprechenden Einträge aus den Arrays heraus. Das kann man alles ordentlich auf Funktionen verteilen und strukturieren.
Rolf
sumpsi - posui - obstruxi