Probleme mit strtotime()

Sprint

Erfahrenes Mitglied
Hallo zusammen,

beim Erstellen einer Statistik ist mir heute aufgefallen, daß strtotime() manchmal falsch rechnet. Und zwar soll über einen gewissen Zeitraum der jeweils auftragsstärkste Tag eines Monats ausgegeben werden. Die gekürzte Schleife dazu sieht so aus:
PHP:
for ($i=27;$i>=0;$i--){
	$statmonat = substr(date("01.m.Y",strtotime("-$i month")),3); // Anzeige in der Grafik
	$dbmonat = substr(date('Y-m-01',strtotime("-$i month")),0,7);
//	$statmonat = date("m.Y",strtotime("-$i month"));
//	$dbmonat = date('Y-m',strtotime("-$i month"));
	$sql="SELECT COUNT(*) as anzahl FROM pruefung where SUBSTR(zeit,1,7) = '$dbmonat' GROUP BY SUBSTR(zeit,1,10) order by anzahl desc;";
echo $i.' - '.$statmonat.' - '.$dbmonat.' - '.$zeile['anzahl'].'<br />';
}
Dabei ist mir aufgefallen, daß der Februar manchmal erscheint und manchmal nicht. Wenn ich mir die Werte mit dem echo ausgeben lasse, sieht das heute z.B. so aus:

5 - 11.2012 - 2012-11 - 11
4 - 12.2012 - 2012-12 - 13
3 - 01.2013 - 2013-01 - 15
2 - 03.2013 - 2013-03 - 17
1 - 03.2013 - 2013-03 - 17
0 - 04.2013 - 2013-04 - 19

Wie ihr seht, wird der Februar ausgelassen und dafür der März zwei Mal verarbeitet. An anderen Tagen ist der Februar dann wieder da. Ich kann mir bloß nicht erklären, wieso!?
Die auskommentierten Zeilen waren der erste Ansatz. Ich habe dann extra jede Rechnung auf den Monatsersten gesetzt, bringt aber auch nichts.

Hat jemand von euch eine Erklärung dafür und vielleicht sogar eine Lösung?

Danke schonmal,
Sprint
 
Löse es in SQL.
Nur sehe ich nicht wirklich was du da machen willst. Und in welchem Format ist das Feld zeit in der DB gespeichert?

item: $dbmonat = substr(date('Y-m-01',strtotime("-$i month")),0,7)
Da nimmst Heute minus $i Monate. Daraus machst du ein Datum. Das formatierst du zu 2013-02-01. Schneidest also den Tag ab. Daraus nimmst du die ersetn 7 Zeichen. Ergo noch 2013-02. Das widerum vergleichst du mit einem Stringvergleich mit dem per String zerlegten Datum in der DB. Sind viele Umwege, findest du nicht auch?
Mit DATE_SUB() kannst die $i Monate abziehen. Mit EXTRACT(YEAR_MONTH FROM xy) kannst du das Jahr und den Monat extrahieren

item: Anstelle von SUBSTR(zeit,1,10) kann man locker DATE() verwenden

Das könnte dann so aussehen
SQL:
SELECT 
	-- Datum aus dem datetime extrahieren
	DATE(zeit) AS datum,
	COUNT(*) as anzahl 
FROM
	pruefung 
WHERE
	-- Jahr/Monat extrahieren
	EXTRACT(
		-- $i Monate von heute abziehen
		YEAR_MONTH FROM DATE_SUB(
			SYSDATE(), 
			INTERVAL {$i} MONTH
		)
	) = EXTRACT(YEAR_MONTH FROM zeit)
GROUP BY 
	DATE(zeit)
ORDER BY
	anzahl
LIMIT 1
 
Zuletzt bearbeitet von einem Moderator:
Zurück