Datums/Zeitvergleich gleich bei DB-Abfrage?
Martin
- datenbank
Guten Morgen
Ich hab folgendes Problem: Ich möchte bei einer Mysql Abfrage gerne die Einträge herausfiltern die älter als die aktuelle Zeit ist.
Einziger Haken (aus meiner Sicht) ist das das Datum und die Zeit in 2 extrigen Feldern gespeichert ist (eintrag_datum, eintrag_zeit).
Das aktuelle Datum bzw Zeit ist ja kein Problem zum erstellen mit PHP nur muss ich bei der Abfrage den gesamten gespeicherten Zeitpunkt mit dem aktuellen vergleichen.
Und genau da scheiter ich.
Hoff jemand kann mir da weiterhelfen!?
Mfg Martin
Hallo Martin!
Wie hast du denn Datum und Zeit gespeichert? Wenn du es als DATE und TIME gemacht hast, kannst du die beiden zu einem DATETIME-String zusammensetzen und diesen dann mittels strtotime() in einen Timestamp umwandeln. Dann sollte der Vergleich mit dem von PHP generierten Timestampt kein Problem sein.
Gruß
Matthias
yo,
Wenn du es als DATE und TIME gemacht hast, kannst du die beiden zu einem DATETIME-String zusammensetzen und diesen dann mittels strtotime() in einen Timestamp umwandeln.
oder aber du ersparrst dir das zusammensetzen und verbindest die zwei bedingungen mit dem OR operator. in umgangssprache in etwa so:
...WHERE datum < heutiges_datum OR datum = heutiges_datum AND zeit < heutige_zeit
um das heutige datum und die aktuelle zeit zu bekommen, stellt mysql bestimmte funktionen zur verfügung.
Ilja
oder aber du ersparrst dir das zusammensetzen und verbindest die zwei bedingungen mit dem OR operator. in umgangssprache in etwa so:
...WHERE datum < heutiges_datum OR datum = heutiges_datum AND zeit < heutige_zeit
Hy Ilja
Also so einen ähnlichen Lösungsansatz hab ich bereits gehabt
where datum <= aktdatum
and zeit <= aktzeit
Das hat aber nicht geklappt aber dein Vorschlag mit dem zusätzlichen OR hört sich nicht schlecht an mal schauen ob das den gewünschten Erfolg bringt. Danke
Mfg Martin
yo,
Also so einen ähnlichen Lösungsansatz hab ich bereits gehabt
where datum <= aktdatum
and zeit <= aktzeit
das geht logisch nicht. mit dem AND operator müssen beide bedingungen erfüllt sein. und eine datum kann durchaus in der vergangenheit liegen, also ein datensatz den du abgreifen willst, die zeit kann durchaus größer als die aktuelle zeit sein. insofern würde er die zweite bedingung nicht erfüllen und wegfallen, was aber nicht erwünscht ist.
Ilja
das geht logisch nicht. mit dem AND operator müssen beide bedingungen erfüllt sein. und eine datum kann durchaus in der vergangenheit liegen, also ein datensatz den du abgreifen willst, die zeit kann durchaus größer als die aktuelle zeit sein. insofern würde er die zweite bedingung nicht erfüllen und wegfallen, was aber nicht erwünscht ist.
Ilja
Ok das hab ich auch bemerkt (-> deshalb hab ich mich ja an dieses Forum gewandt)
Hab jetzt aber ein problem mit der DB Abfrage scheint an der Klammersetzung zu haken:
$result = mysql_query (
" SELECT ... " .
" FROM offer " .
" WHERE offer.aktiv = '1' " .
" AND (offer.enddatum <= '$aktdatum' " .
" AND offer.endzeit <= '$aktzeit' ) " .
" OR offer.enddatum <= '$aktdatum' " )
or die ( "Fehler in " . __FILE__ . " Zeile Nr. " . __LINE__ . " - " . mysql_error() );
yo,
Hab jetzt aber ein problem mit der DB Abfrage scheint an der Klammersetzung zu haken:
wenn es nur um die abfrage geht, am besten immer nur den reinen SQL statement angeben, sprich das php weglassen. macht es einfach leichter.
grundsätzlich gilt AND operator bindet stärker als OR, insofern brauchst du keine klammern. ausserdem hast du die operatoren nicht so eingestzt, wie ich es vorgeschlagen habe.
WHERE offer.aktiv = '1'
AND offer.enddatum < '$aktdatum'
OR offer.enddatum = '$aktdatum' AND offer.endzeit <= '$aktzeit'
Ilja
Ich bin zwar nicht so der mysql crack. aber Ilja hat das ja schon angedeutet.
$result = mysql_query (
" SELECT ... " .
" FROM offer " .
" WHERE offer.aktiv = '1' " .
" AND (offer.enddatum <= '$aktdatum' " .
" AND offer.endzeit <= '$aktzeit' ) " .
" OR offer.enddatum <= '$aktdatum' " )
or die ( "Fehler in " . __FILE__ . " Zeile Nr. " . __LINE__ . " - " . mysql_error() );
warum verwendest du hier anstatt $aktdatum nicht die mysql Funktion NOW() mit den entsprechenden Datumsfunktionen von mysql?
Struppi.
Hallo Martin!
Wie hast du denn Datum und Zeit gespeichert? Wenn du es als DATE und TIME gemacht hast, kannst du die beiden zu einem DATETIME-String zusammensetzen und diesen dann mittels strtotime() in einen Timestamp umwandeln. Dann sollte der Vergleich mit dem von PHP generierten Timestampt kein Problem sein.
Gruß
Matthias
Hallo Matthias
Ja die Felder sind als DATE und TIME gesetzt.
Dein Lösungsvorschlag wäre dann das ich zuerst die Einträge auslese und dann erst im PHP vergleiche?
Kann ich das nicht gleich in der SELECT Abfrage einbauen?
z.B. : ... WHERE $eintrag_datum $eintrag_zeit <= $akt_timestamp ???
Mit CONCATE kann man ja Datenbankfelder kombinieren oder? Kommt ich damit vielleicht an das gewünschte Ziel?
Mfg Martin
hi,
Einziger Haken (aus meiner Sicht) ist das das Datum und die Zeit in 2 extrigen Feldern gespeichert ist (eintrag_datum, eintrag_zeit).
diesen mangel deiner datenstruktur solltest du m.E. zuerst beseitigen.
(nein, ein wirklich plausibler grund für diese trennung fällt mir nicht ein.)
gruß,
wahsaga
yo,
(nein, ein wirklich plausibler grund für diese trennung fällt mir nicht ein.)
kommt auf das dbms an. mir würde zum beispiel ein grund einfallen, wenn nur über die zeit eine bedingung in der WHERE klausel gesetzt wird und das aus performance gründen ein index laufen soll. nicht jedes dbms kennt nämlich auch einen funktionalen-index. aber grundsätzlich würde ich dir zustimmen, vielleicht ist es einfacher das daten-design zu ändern.
Ilja