Antwort an „Rolf B“ verfassen

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
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen