SQL und die Sache mit dem Datum

deintag85

Erfahrenes Mitglied
Hallo,
ich möchte mich eigentlich nicht als Laie bezeichnen, aber aus meinem Büchern hier und im Internet werde ich auch nicht schlau, da ich keine richtigen Beispiele finde.

Ich versuche einen Counter zu programmieren. Er soll in jeweils 5 Felder folgendes eintragen :

Datum : DD-MM-YYYY
Tag : DD
Monat : MM
Jahr : YYYY
Stunde : HH

Naja, vllt sind die 4 hinteren Felder unnötig. Ich weiss es nicht. Ich will also wenn ein Besucher kommt das Datum sowie die Uhrzeit in die SQL Speichern.

Anschließend will ich dann eine Statistik abgeben, wie z.B. 30 Tage Statistik, oder die letzten 24 Stunden.

Wie soll das SQL Feld formatiert sein(Datentyp) und mit welchen Befehl mach ich die Beste Lösung, sodass ich später einfach jedes Gesuchte finden kann (Tag, Monat; Jahr, Stunde)....

Ich find nur Beschreibungen der Datentypen und Funktionen. Aber nichts davon klappt. z.B. mach ich als Datentyp (Date) und versuche diverse Funktionen wie NOW() oder CURDATE() aber es erscheint immer 0000-00-00

:(

kann mir jemand weiterhelfen? oder gibt es ein sehr sehr umfangreiches tolles tutorial für sowas?

Liebe Grüße
 
Hi,

Du brauchst nur ein Feld, die anderen 4 sind überflüssig. Leg das Feld als DATETIME an, dann steht die Uhrzeit gleich mit drin.

Ein Tutorial speziell zu diesem Thema ist mir nicht bekannt, post doch einfach mal, was Du da versucht hast.

LG
 
Habs umgeändert in DateTime

und nochmal probiert

Code:
INSERT INTO Datum SET Datum="NOW()";

jetzt steht da 0000-00-00 00:00:00 in der Tabelle =)
 
Hi,

alle Datensätze vom 1. April 2009:
Code:
SELECT Datum FROM Datum 
   WHERE DATE(Datum) = '2009-04-01'

alle Datensätze vom 1. April 2009 15:00 Uhr - 15:59 Uhr:
Code:
SELECT Datum FROM Datum 
   WHERE DATE(Datum) = '2009-04-01'
      AND HOUR(Datum) = 15

Ist das Prinzip jetzt klarer?

LG
 
Hallo,
hat alles wunderbar geklappt. Hab jetzt noch ne weitere Frage zum gleichen Thema.

Und zwar hab ich vor z.B. die letzten 30 Tage anzuzeigen. Ich mach also ne Schleife die bis 30 zählt. Wollte das anfänglich so machen

Code:
$tag = date("d");
$tag -= 1;
$monat =date("m");
$jahr =date("Y");
$sqldatum = date("Y-m").'-'.$tag;

Bei jedem Zeilenaufruf soll Tag um 1 erniedrigt werden.
Das passt so in etwa dann in die SQL-Abfrage.

Code:
$abfragetwo = "SELECT COUNT(*) as Seitenaufrufe FROM `".$counter."` WHERE DATE(Datum) = '".$sqldatum."'";

Jedoch würde das nur klappen wenn heute zum Beispiel der 30ste ist. Was wenn der 15te ist, dann zählt er ja ins negative. Ich könnte natürlich jetzt ne ellenmega blödsinnige if-verzweigung machen, falls jener monat dann soll er da wieder anfangen runterzuzählen.

Geht das nicht einfacher allgemein?
Leider kann man bei date(Y-m-d) nicht -1 machen sodass er einfach einen Tag abzieht. Geht das irgendwie anders?

LG
 
Hi,

warum machst Du denn für jeden Tag eine Datenbankabfrage? Frag die letzten 30 Tage ab und durchlaufe das Ergebnis, ungefähr so:

SQL:
SELECT COUNT(*) as Seitenaufrufe 
   FROM counter 
   WHERE DATE(Datum) BETWEEN 
      DATE_SUB(DATE(Datum) INTERVAL 30 DAY) and DATE(NOW())
   GROUP BY DATE(Datum)
   ORDER BY Datum DESC

LG
 
Weil ich 2 seperate SQL Abfragen hab.
Hab eine Tabelle

Tag / Besucher / Seitenaufrufe

Als AUsgabe kommt dann

30.05.2009 / x / y

Ich hab 2 verschiedene Werte die ich an verschiedene Stellen der Table einfügen muss.

Deshalb brauch ich zum Einen

Code:
$abfrage = "SELECT COUNT(DISTINCT IP) as Besucher FROM `".$counter."` WHERE DATE(Datum) = '".$sqldatum."'";

und zum Anderen

Code:
$abfragetwo = "SELECT COUNT(*) as Seitenaufrufe FROM `".$counter."` WHERE DATE(Datum) = '".$sqldatum."'";

Hier mal ein sehr umständliches Beispiel für die Ausgabe von einem Tag in Stunden

0:00-1:00 Uhr / x / y

Code:
while ($clock < 24) {
	if ($clock < 9) {
		echo'<tr><td style="border-bottom:1px dotted #585858;">0'.$clock.':00 - 0'.($clock+1).':00</td>';
	}
	elseif ($clock == 9) {
		echo'<tr><td style="border-bottom:1px dotted #585858;">0'.$clock.':00 - '.($clock+1).':00</td>';
	}	
	else {
		echo'<tr><td style="border-bottom:1px dotted #585858;">'.$clock.':00 - '.($clock+1).':00</td>';
	}

	
	// Besucher zählen und ausgeben
	$abfrage = "SELECT COUNT(DISTINCT IP) as Besucher FROM `".$counter."` WHERE DATE(Datum) = '".$sqldatum."' AND HOUR(Datum) = '".$clock."'";
	$ergebnis = mysql_query($abfrage);
	$user = mysql_fetch_assoc($ergebnis);
	echo'<td style="border-bottom:1px dotted #585858;">'.$user["Besucher"].'</td>';

	// Seitenaufrufe zählen und ausgeben
	$abfragetwo = "SELECT COUNT(*) as Seitenaufrufe FROM `".$counter."` WHERE DATE(Datum) = '".$sqldatum."' AND HOUR(Datum) = '".$clock."'";
	$ergebnistwo = mysql_query($abfragetwo);
	$views = mysql_fetch_assoc($ergebnistwo);
	echo'<td style="border-bottom:1px dotted #585858;">'.$views["Seitenaufrufe"].'</td>';		
	
	if($views["Seitenaufrufe"] !=0 && $user["Besucher"] !=0) {
	$pi = ($views["Seitenaufrufe"])/($user["Besucher"]);
	$pi = number_format($pi, 2, ',', '');	
	}
	else {
	$pi = 0;
	$pi = number_format($pi, 2, ',', '');
	}
	
	echo'<td style="border-bottom:1px dotted #585858;">'.$pi.'</td></tr>';		

	$clock=$clock+1;
}

So in etwa wollt ich das auch nun mit 30 Tagen machen und später mit 12 Monaten. Gibts da keine einfach praktische Möglichkeit? Oder muss ich die Tabelle von Grund auf umstrukturieren?

LG
 
Weil ich 2 seperate SQL Abfragen hab.

Was aber nicht nötig ist, soweit ich das sehe.

Hab eine Tabelle

Tag / Besucher / Seitenaufrufe

Als AUsgabe kommt dann

30.05.2009 / x / y

Ich dachte, Du hättest da ein Feld "Datum" vom Typ DATETIME, so dass Du pro Seitenaufruf einen Datensatz mit dem genauen Zeitstempel hast.
Das sieht jetzt so aus, als würdest Du pro Tag die Seitenaufrufe pro IP in einem Datensatz speichern, also:

2009-05-29 xxx.xxx.xxx 12

Sonst wäre das Feld "Seitenaufrufe" ja überflüssig. Wenn das so ist, liefert Dir aber Deine SELECT COUNT(*) Abfrage falsche Ergebnisse, da sie die zurückgelieferten Datensätze zählt. Da müsstest Du "Seitenaufrufe" summieren.

In dem Fall:

SQL:
SELECT SUM(Seitenaufrufe) AS Seitenaufrufe_gesamt, 
      COUNT(DISTINCT ip) AS Anzahl_Besucher
   FROM counter
   WHERE DATE(Datum) BETWEEN
      DATE_SUB(DATE(Datum) INTERVAL 30 DAY) AND DATE(NOW())
   GROUP BY DATE(Datum)
   ORDER BY Datum DESC

Falls ich mich geirrt habe, ersetzt Du einfach den SUM-Ausdruck wieder durch COUNT(*).

Durch die Gruppierung kannst Du nach Herzenslust mehrere Werte mittels Aggregation Functions in einer Abfrage berechnen.

LG
 

Neue Beiträge

Zurück