dedlfix: MySQL: Alle abgedeckten Monate/Tage erkennen

Beitrag lesen

echo $begrüßung;

Zu jedem Termin gibt es ein DATETIME Feld mit dem Startpunkt und ein DATETIME Feld mit dem Endzeitpunkt.
Auf Seite 1 bräuchte ich eine Monatsübersicht, also es sollen alle Monate angezeigt werden in denen mind. ein Termin liegt.
Auf Seite 2 möchte ich das selbe Spiel mit einer Tagesauswahl machen.
Kann mir irgendwer einen Schubs in die richtige Richtung geben, wie ich meine mySQL Abfrage am besten gestalte um möglichst Effektiv an die benötigten Infos zu kommen?

Bei einem mehrere Tage dauernden Ereignis möchtest du sozusagen für jeden Tag ein Ergebnisdatensatz haben. Bei mehrfach vorkommenden Tagen hilft ein DISTINCT, die Dopplungen zu entfernen, das ist also kein Problem. Doch wie erzeugt man aus einem Datensatz mehrere definierte Ergebniszeilen?

Da ich dazu keine Lösung kenne würde ich die betroffenen Tage in der verwendeten Programmierumgebung ermitteln. Zunächst aber zum SQL-Teil:

WHERE
    (start >= monatserster AND start <= ultimo) OR  # StartDatum im betroffenen Monat
    (ende <= ultimo AND ende >= monatserster) OR   # EndeDatum innerhalb des Monats
    (start < monatserster AND ende > ultimo)  # Monat liegt zwischen Start und Ende

sollte alle Datensätze ermitteln, die den abzufragenden Monat betreffen. Nun sollen in den Ergebnisdatensätzen keine Tage außerhalb des Monats enthalten sein. Wenn das Startdatum vor dem Monatsersten liegt soll stattdessen der Monatserste angezeigt werden. Analog beim Monatsende.

SELECT
    DAYOFMONTH( IF( start < monatserster, monatserster, start)) AS starttag,
    DAYOFMONTH( IF( ende > ultimo, ultimo, ende)) AS endtag

In der Programmierumgebung muss nun noch für jeden Ergebnisdatensatz in einer von starttag bis endtag laufenden Schleife für jeden Tag "ein Kreuzchen im Kalender" gemacht werden.

Der Ultimo lässt sich soweit ich weiß nicht mit MySQL ermitteln, aber beispielsweise in PHP mit date('t', $ein_datum_aus_dem_Monat)

Dieses Prinzip sollte sich auch für ein Jahr anwenden lassen.

echo "$verabschiedung $name";