Christian Seiler: PHP-Abfrage für die jeweiligen Wochenenden

Beitrag lesen

Hallo,

Sorry, ich finde leider keine schonende Methode das zu sagen, daher sage ich's direkt: Der Code ist Müll. Er Code ist ineffizient (für jeden Wochentag einen eigenen case, wenn einfache Arithmetik ausreicht?) und fliegt zudem bei Sommer- und Winterzeitumstellungen potentiell auf die Schnauze. Zudem ist j.n.Y nicht unbedingt sinnvoll als Datumsformat, um es einer Datenbank zu übergeben - Y-m-d ist besser.

Wenn der Code also in PHP und nicht im SQL sein soll (entgegen meiner Lösung), dann würde folgender PHP-Code wesentlich besser geeignet sein:

$jetzt = time ();  
$wochentag = date ('w', $jetzt);  
$tage = (7 - $wochentag) % 7;  
// ende des wochenendes  
$montag = strtotime ('00:00:00 + '.($tage + 1).' days');  
// start des wochenendes  
$samstag = strtotime ('- 2 days', $montag);  
  
// datum berechnen  
$startDatum = date ('Y-m-d', $samstag);  
$endDatum = date ('Y-m-d', $montag);  
  
// SQL-select ausgeben  
$query = "SELECT ... WHERE datum >= '".mysql_real_escape_string ($startDatum)."' AND datum < '".mysql_real_escape_string ($endDatum)."'";

Zur Erläuterung:

$jetzt = time ();

Aktuelles Datum holen und sich merken.

$wochentag = date ('w', $jetzt);

Den Wochentag des aktuellen Datums bestimmen. Hierbei ist 0 = Sonntag und 6 = Samstag.

$tage = (7 - $wochentag) % 7;

Die Anzahl an verbleibenden Tagen bis zum Sonntag (Ende des Wochenendes) berechnen - siehe meine andere Funktion.

$montag = strtotime ('00:00:00 + '.($tage + 1).' days', $jetzt);

Wir brauchen das Datum von Montag um Mitternacht. Hier wird explizit strtotime() genutzt und *NICHT* auf den Timestamp einfach 86400 addiert / subtraiert, weil nicht jeder Tag 86400 Sekunden hat (bei der Umstellung von Sommer- auf Winterzeit nämlich nicht!).

Zur genauen Erläuterung, was strtotime() hier macht:

strtotime('00:00:00', $jetzt) gibt den Timestamp um Mitternacht des Tages zurück, an dem sich $jetzt befindet (d.h. wenn $jetzt bereits Mitternacht wäre, würde es $jetzt zurückgeben).

Wenn man jetzt noch zusätzlich z.B. ' + 2 days' anängt, dann wird auf das aktuelle Datum 2 Tage addiert. Dies geschieht jedoch NICHT über Vielfache von 86400, sondern über richtige Kalenderberechnung - sprich: Sommer- und Winterzeitumstellungen werden korrekt berücksichtigt.

$samstag = strtotime ('- 2 days', $montag);

Hier wird nun der Start des Wochenendes gesucht.

$startDatum = date ('Y-m-d', $samstag);  
$endDatum = date ('Y-m-d', $montag);

Hier werden die Daten jetzt so formatiert, das die Datenbank sie versteht.

$query = "SELECT ... WHERE datum >= '".mysql_real_escape_string ($startDatum)."' AND datum < '".mysql_real_escape_string ($endDatum)."'";

Und hier wird exemplarisch die Abfrage zusammengebaut.

Viele Grüße,
Christian