Sehr häufig, ich behaupte teilweise fast immer, ist es notwendig ein Datum oder sogar mehrere verschiedene Daten (Plural von Datum) in einem Datensatz in der Datenbank zu speichern – entweder als ein bestimmtes Datum, zum Beispiel als eine Art von Frist oder einfach ein banales Datum wie den Zeitstempel (engl. timestamp), der festhält, zu welchem Zeitpunkt der Datensatz eigentlich angelegt wurde.
In der Praxis hat man ab und an Fälle, bei denen man die Daten vergleichen muss, um die richtigen Datensätze selektieren zu können. Solche Vergleiche werden häufig in automatisierten Prozessen eingesetzt, die durch einen Cronjob ausgelöst werden können. Sehr oft vergleicht man die Felder der Tabelle mit dem gerade aktuellen Zeitpunkt. Dazu gibt es wie so oft sehr unterschiedliche Herangehensweisen und je nach Anforderung werden für die Umsetzung in der Anfrage (Query) dann unterschiedliche MySQL-Funktionen benutzt.
Wird eine Differenz zwischen zwei Zeitpunkten benötigt, bei die Anzahl der Tage ausreicht, dann kann man dafür die MySQL-Funktion DATEDIFF() nehmen. Diese gibt die Anzahl der Tage zwischen zwei Daten zurück – also das Intervall. Für den Vergleich können die Parameter entweder vom Typ DATE oder DATETIME sein. Für die Berechnung werden nur die Datumsanteile verwendet. Stunden, Minuten sowie Sekunden bleiben unberührt.
Beispielsweise liefert uns der MySQL-Query:
1 2 |
$result = mysql_query("SELECT DATEDIFF('2012-12-31 23:59:59','2012-12-29')"); echo mysql_result($result, 0); |
als Ergebnis: 2
Statt zwei festen Daten kann man für den Vergleich auch das aktuelle Datum heranziehen. Dafür eignet sich die Funktion NOW(). Das obere Beispiel sieht dann folgendermaßen aus:
1 2 |
$result = mysql_query("SELECT DATEDIFF('2012-12-31 23:59:59', NOW())"); echo mysql_result ($result, 0); |
Am heutigen Datum (17.12.2012) liefert der Query als Ergebnis: 14
Es kann aber auch sein, dass für die Selektion der Datensätze nicht nur die Anzahl der Tage, sondern vielleicht genauere Zeitgrenzen benötigt werden. In diesen Fällen würde ich den Unix-Timestamp nutzen. Die Vorgehensweise ist dann die, dass das DATETIME-Feld mit der Funktion UNIX_TIMESTAMP() zunächt in einen Timestamp umgewandelt wird. Anschließend kann man die Timestamps miteinander vergleichen. UNIX_TIMESTAMP() liefert ohne Angabe eines Parameters den aktuellen Zeitstempel.
1 2 3 |
mysql_query(" SELECT * FROM tabelle WHERE (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(datumsfeld)) >= 172800"); |
Möchte man nach Ablauf von genau 2 Tagen, also 48 Stunden einen Datensatz verarbeiten, dann kann man diesen wie oben zu sehen suchen. Die Differenz der beiden Werte muss 60 * 60 * 48 = 172800 oder mehr betragen.