Martin: Datums/Zeitvergleich gleich bei DB-Abfrage?

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

  1. 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

    --
    ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
    http://www.makaio.de/quotations
    1. 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

      1. 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

        1. 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

          1. 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() );

            1. 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

            2. 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.

    2. 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

  2. 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

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. 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