Phil: Php/Mysql Selektion von Zeiträumen

Hallo Zusammen,

Ich arbeite zurzeit an einem eigenen Counter inklusive Auswertung. Nun habe ich mich gefragt, wie es möglich ist, Zeiträume zu selektieren? Ich habe zum Beispiel ein Datum und möchte alle Daten ausgeben, die von jetzt bis einen Monat zurück erstellt wurden. Nach welche Prinzip funktiniert das?

Zudem habe ich mich gefragt, ob ich anhand der IP und der Zeit des Seitenaufrufs selektieren oder rausfiltern kann, wie lange der Besucher auf meiner Seite war. Sozusagen, die Differenz der der Zeit zwischen den eizelnen Klicks?

Für Inputs wäre ich sehr dankbar! Grüsse, Philipp

  1. echo $begrüßung;

    [...] wie es möglich ist, Zeiträume zu selektieren? Ich habe zum Beispiel ein Datum und möchte alle Daten ausgeben, die von jetzt bis einen Monat zurück erstellt wurden. Nach welche Prinzip funktiniert das?

    Für das Berechnen von Zeiten gibt es eine Menge Funktionen. Und einen Wert zwischen zwei Punkten kann man mittel BETWEEN ermitteln. Um von einem Referenzdatum ein zweites zu berechnen, eignen sich DATE_ADD() und DATE_SUB() beziehungsweise die ebenfalls dort dokumetnierte Form

    date +/- INTERVAL expr unit

    Mithin kommt man "Jetzt abzüglich ein Monat" mit:

    NOW() - INTERVAL 1 MONTH

    Zudem habe ich mich gefragt, ob ich anhand der IP und der Zeit des Seitenaufrufs selektieren oder rausfiltern kann, wie lange der Besucher auf meiner Seite war. Sozusagen, die Differenz der der Zeit zwischen den eizelnen Klicks?

    Diese Diskussion wurde schon des öfteren geführt. Die Antwort ist: vom Prinzip her nicht möglich. Du kannst nicht davon ausgehen, dass jemand zwischen dem ersten und letzten Klick durchweg und ohne Unterbrechung deine Seite gelesen hat. Die Zeit zwischen zwei Klicks sagt nichts über das Anwenderverhalten währenddessen aus. Außerdem bekommst du nicht mit, wann das Lesen des Inhalts vom letzten Request endete. Obendrein können Proxys und Caches deine "Messung" beeinflussen.

    echo "$verabschiedung $name";

    1. Danke für die Antwort! Hat mir sehr geholfen!

      Noch eine letzte kleine Frage. Wenn ich gerne nur den Monat August selektieren möchte, wie klappt dies? Danke!

      1. echo $begrüßung;

        Wenn ich gerne nur den Monat August selektieren möchte, wie klappt dies?

        Man könnte das Datum anhand von Jahr und Monat einschränken:

        WHERE YEAR(datum) = 2008 AND MONTH(datum) = 8

        die Funktion EXTRACT() verwenden:

        WHERE EXTRACT(YEAR_MONTH FROM datum) = '200808'

        oder zur Not auch DATE_FORMAT():

        WHERE DATE_FORMAT(datum, '%Y%m') = '200808'

        Alle drei Varianten haben jedoch den Nachteil, dass die Berechnung für jeden Datensatz durchgeführt werden muss. Es kann dabei kein Index verwendet werden, wenn einer auf der Datumsspalte liegt. Für kleine Datenmengen fällt das nicht weiter ins Gewicht. Besser ist es jedoch, auch hier BETWEEN zu verwenden. Den Monatsanfang kann man recht einfach notieren

        2008-08-01 oder mit Zeit 2008-08-01 00:00:00

        Den Monatsletzten kann man mit PHP berechnen:

        date('Y-m-d H:i:s', mktime(23, 59, 59, $monat + 1, 0, 2008))

        Die Funktion mktime() rechnet ja mit, so dass man einen Monat hinzuzählen und beim Tag 0 angeben kann, was dann den Vortag vom 1. ergibt. Das klappt auch beim Jahreswechsel und mit Schaltjahren problemlos. Braucht man keine Uhrzeit, lässt man H:i:s weg und setzt die entsprechenden mktime-Parameter auf 0.

        $sql = sprintf("SELECT ... WHERE datum BETWEEN '%s' AND '%s'",
            date('Y-m-d H:i:s', mktime(0, 0, 0, $monat, 1, $jahr)),
            date('Y-m-d H:i:s', mktime(23, 59, 59, $monat + 1, 0, $jahr)));

        echo "$verabschiedung $name";

        1. echo $begrüßung;

          Den Monatsletzten kann man mit PHP berechnen:
            date('Y-m-d H:i:s', mktime(23, 59, 59, $monat + 1, 0, 2008))

          Es geht auch ohne zu rechnen. Wenn man bereits einen Timestamp innerhalb des Monats vorliegen hat, beispielsweise den vom Monatsersten, kann man den auch zum Monatsletzten umformatieren. Das Formatzeichen t statt d macht dies:

          date('Y-m-t 23:59:59', $timstamp_vom_ersten)

          echo "$verabschiedung $name";

        2. Hi dedlfix,

          Den Monatsletzten kann man mit PHP berechnen:

          date('Y-m-d H:i:s', mktime(23, 59, 59, $monat + 1, 0, 2008))

          MySQL kann das auch mit LAST_DAY():

            
          SELECT ... WHERE datum BETWEEN '2008-08-01' AND LAST_DAY('2008-08-01')  
          
          

          Gruß,
          Andreas.

          1. echo $begrüßung;

            Den Monatsletzten kann man mit PHP berechnen:
              date('Y-m-d H:i:s', mktime(23, 59, 59, $monat + 1, 0, 2008))
            MySQL kann das auch mit LAST_DAY():

            Auch gut. Ist aber so nur dann verwendbar, wenn es sich um eine Datums-Spalte ohne Zeitangabe handelt. Denn jede Uhrzeit außer 0 Uhr am 2008-08-31 ist größer als LAST_DAY('2008-08-01'), was diesen Tag praktisch ausschließt. Man muss da noch

            LAST_DAY(...) + INTERVAL '23:59:59' HOUR_SECOND

            hinzurechnen, um den Wert mit BETWEEN verwenden zu können.

            echo "$verabschiedung $name";