Jan Wa: PHP/MySql - Vormonatstage

Hallo!

Ich knoble gerade an folgender Sache: ich habe eine Termindatenbank, für die ich eine Monatskalenderansicht generiere.

Ich bestimme den aktuellen Monat und hole per MySql alle Tage aus der Datenbank.

Daraus baue ich eine Monatskalenderansicht, mit wochenweisen Zeilen.

Wenn jetzt bspw. der 1. eines Monats ein Mittwoch ist, würde ich gern die Tage Montag und Dienstag des Vormonats auch in dem Kalender noch mit darstellen. Genauso in der letzten Zeile. Sollte der letzte Tag des Monats ein Donnerstag sein, so möchte ich, dass trotzdem noch der Freitag/Samstag/Sonntag des Folgemonats mit in dem Kalender angezeigt werden.

Meine Abfrage ist aktuell diese: SELECT DISTINCT UNIX_TIMESTAMP(d_datum) ut_date FROM dates WHERE DATE_FORMAT(d_datum, '%Y%m') = date('Ym', $aktuellesDatum)

Sollte ich einfach die sechs vorherigen und nachfolgenden Tage mit auslesen und dann bei der Darstellung des Kalenders darauf achten, dass nur die Fülltage mit ausgegeben werden? Oder gibt es einen sinnvollen Ansatz schon bei der Datenbankabfrage nur die Fülltage abzufragen, die ich auch benötige?

Danke Jan

  1. Tach!

    SELECT DISTINCT UNIX_TIMESTAMP(d_datum) ut_date FROM dates WHERE DATE_FORMAT(d_datum, '%Y%m') = date('Ym', $aktuellesDatum)

    Wenn es nur um eine Handvoll Datensätze geht, kann man das so machen. Aber diese WHERE-Bedingung ist so formuliert, dass die für jeden Datensatz einzeln berechnet werden muss und kein Index verwendet werden kann.

    Oder gibt es einen sinnvollen Ansatz schon bei der Datenbankabfrage nur die Fülltage abzufragen, die ich auch benötige?

    Ich würde die Ermittlung des Start und des Endes in das abfragende Programm aufnehmen und die SQL-Query lediglich mit WHERE d_datum BETWEEN $anfang AND $ende ausführen. Auf diese Weise übergibt man zwei konstante Werte an die Query und das DBMS kann auch gleich noch einen eventuell vorhandenen Index benutzen.

    dedlfix.

    1. Ich würde die Ermittlung des Start und des Endes in das abfragende Programm aufnehmen und die SQL-Query lediglich mit WHERE d_datum BETWEEN $anfang AND $ende ausführen. Auf diese Weise übergibt man zwei konstante Werte an die Query und das DBMS kann auch gleich noch einen eventuell vorhandenen Index benutzen.

      Genau so! Die meisten Programmiersprachen bieten recht einfache Möglichkeiten das Start- und Enddatum zu berechnen. Warum also das nicht vor der Abfrage machen, sondern die abgefragten (und also gefilterten) Daten dann nochmals zu bearbeiten oder auch nur diejenigen, die zuviel zu sind, zu ignorieren? Das ist, einzig wegen wegen der falschen Reihenfolge, Verschwendung von Prozessortakten, Speicher und eventuell Netzwerkkapazität.

      1. Ok, dann schau ich mir das so an.

        Vielen Dank euch beiden und ein tolles Wochenende uns allen :)

  2. Hallo und guten Tag,

    Meine Abfrage ist aktuell diese: SELECT DISTINCT UNIX_TIMESTAMP(d_datum) ut_date FROM dates WHERE DATE_FORMAT(d_datum, '%Y%m') = date('Ym', $aktuellesDatum)

    Sollte ich einfach die sechs vorherigen und nachfolgenden Tage mit auslesen und dann bei der Darstellung des Kalenders darauf achten, dass nur die Fülltage mit ausgegeben werden? Oder gibt es einen sinnvollen Ansatz schon bei der Datenbankabfrage nur die Fülltage abzufragen, die ich auch benötige?

    1. Du könntest den Wochentag vorher (numerisch) bestimmen und dann in die Between-Abrage mit einbauen.

    2. Du könntest die Grenzen auch vorher in der API durchführen

    3. Es ist bei Kalendern oft günstiger, nicht mit dem Datum, sondern mit dem Tag des Jahres zu arbeiten, oder sogar - wegen der Sommerzeit - mit der Stunde des Jahres. Die Rückrechnung in das Datum kann man dann der Darstellungsfunktion überlassen

    4. Da das Jahr eine überschaubare Zahl von Tagen hat, könntest Du dir auch eine Tabelle (in PHP) für das Jahr bereithalten, aus der Du dann genau den Offset für die Abfrage ablesen kannt.

    Ich würde aber auf jeden Fall das Rechnen aus dem eigentlichen Filter def DB-Abfrage heraushalten

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de