sortieren über datumsauswahl

hcb

Grünschnabel
Hi KollegInnen,

ich habe ein Problem bei einem Datenbankprojekt, dass ich aus Zeitgründen ziemlich schnell gelöst haben muss. Daher meine Bitte - obwohl ich bereits fleißig auf der Suche in FAQ usw. war - hier durch Euch eine Lösung zu erhalten.

Also:
Kunden geben Daten in die Datenbank ein, das Datum des Eintrags halte ich mit der Variablen und diesem Format
$datum = date("d m y H:i:s");
fest. Es wird tadellos in der Datenbank eingelesen.

Problem 1:
Bei meiner Auswertungssuchmaske möchte ich im Formular die Möglichkeiten haben:
Kunden des gleichen Tages;
Kunden des gestrigen Tages;
Kunden des laufenden Woche;
(evtl. noch mehr Differenzierungen).

Dafür benötige ich den den Optionfeldern der Pulldownliste die nötige PHP-Syntax, um auf meine Daten zuzugreifen.

Problem 2:
Mit dem Absenden der Fomularabfrage rufe ich eine Datei auf, die mir die Daten aus der Datenbank holt und anzeigt. Dabei verwende ich zur differenzierten Herstellung der WHERE-Bedingung ein Array (das ich hier in diesem Forum gefunden habe und das super klappt).

$where=array();
if ($jahre !== "0") {
$where[]="jahre = '$jahre'";
}
if ($ort !== "0") {
$where[]="ort = '$ort'";
}
if ($geschlecht != "") {
$where[]="geschlecht = '$geschlecht'";
}
if ($zeit !== "0") {
$where[]="datum = ????????";
}

Hier benötige ich den richtigen Code, um die entsprechende Auswahl zu erhalten, die ich mit dem Suchformular erzielen will.

Die Variable $zeit steht für das entsprechende Auswahlfeld im Formular.

Ich hoffe, mich verständlich ausgedrückt zu haben, damit mir jemand exakt helfen kann.

danke bereits im voraus, denn ich habe schon mehrmal hier gute Hilfe erhalten.

HCB
 
Hi,

probier mal den Wert time() in der Datenbank zu speichern wenn ein neuer eintrag erzeugt wird. Mit dem Timestamp kannst Du wesentlich bessere WHERE Abfragen generieren als mit d m y H:i:s.

Zum anderen kannst du dann alle erdenkbaren Kombinationen ausgeben lassen.

Gruß Sebastian
 
Hi, wieder da, war leider krank.
Danke für die meldung.

Probiere aber immer noch rum, weils noch nicht klappt.

Auf Tipp 1 hin mit time():
Wie kann ich da genau erfassen, wann einer heute oder gestern oder letzte Woche eingetragen hat?
Denke, das muss mit mktime gehen, bekomme es aber nicht gebacken, weil ich nicht den genauen SQL-Part in der Where-Bedingung bezüglich der Datenbank hinkriege.
Vielleicht ungefähr so:
(Bsp. für den gestrigen teil)

$gestern = mktime(0, 0, 0, date("m"), date("d")-1, date("Y"));

...WHERE datum = '$gestern'"; (Code vorne ist klar)

Hier hänge ich??!!


Ein Tipp2 war von einem Livekontakt:
Ich soll es doch mit date probieren und zwar auf diese Art


....WHERE datum between '$d_start' and '$d_end'";

wobei diese variablen auch im Abfrageformular definiert werden können.


Hier hänge ich auch!
Liegt es am logischen Aufbau (Denkfehler), an des Syntax oder am Format der Datenbank, in der ich das Datum wie oben angegeben gespeichert habe?

Hat jemand eine Idee?

Danke schon mal



:-)
 
Hi,

ja - du hast ein denkfehler. time oder mktime ermittelt ja ein Zeitpunkt genau auf die Sekunde genau. Das heißt, wenn du "WHERE datum = '$gestern'" benutzt, werden nur beiträge ermittelt die GENAU zu dieser sekunde, an diesem Tag etc. geschrieben worden sind.

Das heißt. Du musst 2 timestamps mit mktime ermitteln. Ein Beispiel:

PHP:
$gestern_morgen = mktime(0, 0, 0, date("m"), date("d")-1, date("Y"));
$gestern_abends = mktime(24, 0, 0, date("m"), date("d")-1, date("Y"));

WHERE datum >= $gestern_morgen AND datum <= $gestern_abend

so würd ich es machen bzw habe ich gemacht ;)

Gruß
Sebastian
 
Hi Sebastian, danke für deine Antwort.

Der logische Fehler leuchtet mir ein. Ich habe es auch so probiert wie gesagt. Klappt nicht.

Kann es sein, dass ich das Datum falsch in der Datenbank speichere als varchar (weil datetime nicht hinhaut). Hat das Format also was mit der Funktionsweise zu tun? Setzt der Gebrauch von mktime auch eine genau Formatierung der Daten beim Generieren voraus? Bisher habe ich das Datum so formatiert:

$datum = date("d m Y H:i:s");

Vielleicht hängts ja hier?

Schön wenn du mir weiterhilfst!

:-)
 
Hi,

benutze INT(10) und speichere den timestamp = time() in der datenbank ab.

Das Formatieren des Datums machst du erst ganz zum schluss wenn du es wirklich auf dem bildschirm ausgibst.

Rob
 
Danke, jetzt klappt es hervorragend.
Wo er Fehler genau war, weiß ich nun nicht mehr, denn noch vor der letzten Meldung von KMX-Robin hat es plötzlich doch funktioniert.

Ich mache es jetzt so:

PHP:
// Zeit berechnen
$heute_morgen = mktime(0, 0, 0, date("m"), date("d"), date("y"));
$heute_abends = mktime(24, 0, 0, date("m"), date("d"), date("y"));
$gestern_morgen = mktime(0, 0, 0, date("m"), date("d")-1, date("y"));
$gestern_abends = mktime(24, 0, 0, date("m"), date("d")-1, date("y"));
$vorgestern_morgen = mktime(0, 0, 0, date("m"), date("d")-2, date("y"));
$vorgestern_abends = mktime(24, 0, 0, date("m"), date("d")-2, date("y"));
$woche_anfang = mktime(0, 0, 0, date("m"), date("d")-7, date("y"));
$woche_ende = mktime(24, 0, 0, date("m"), date("d"), date("y"));
Dann wird das in dem Array entsprechend der Formularangabe von tempus eingegeben:


PHP:
 $where=array(); 
.....
if ($tempus == "h") { 
        $where[]="zeit >= $heute_morgen AND zeit <= $heute_abends";
    } 
	if ($tempus == "g") { 
        $where[]="zeit >= $gestern_morgen AND zeit <= $gestern_abends";
	}	
		if ($tempus == "v") { 
        $where[]="zeit >= $vorgestern_morgen AND zeit <= $vorgestern_abends";
    } 
     	if ($tempus == "w") { 
        $where[]="zeit >= $woche_anfang AND zeit <= $woche_ende";
    } 
......

}


So nochmals viele Dank für die Blockadeüberwindung!

so long
 
Zurück