peschels: Datumsabfrage in MYSQL

Hallo zusammen,

ich habe folgendes Problem:
In einer mysql-Datenbank habe ich verschiedene Termine gespeichert. Wie schaffe ich es, dass immer nur der chronologisch nächste angezeigt wird?
Also z.B. Tabelle "termine"
date        termin
1999-03-31  test1
2011-05-01  test2
2012-12-28  test3
2015-01-01  test4

Es soll also "2012-12-28  test3" angezeigt werden. Wie stelle ich das an?
Danke und Gruß peschels

  1. Hallo,

    In einer mysql-Datenbank habe ich verschiedene Termine gespeichert. Wie schaffe ich es, dass immer nur der chronologisch nächste angezeigt wird?

    _selektiere_ nur Einträge, deren Datum größer oder gleich dem aktuellen Datum ist; _sortiere_ sie aufsteigend nach Datum; _limitiere_ die Menge auf 1 (oder verwerte nur das erste Ergebnis).

    Also z.B. Tabelle "termine"
    date        termin
    1999-03-31  test1
    2011-05-01  test2
    2012-12-28  test3
    2015-01-01  test4
    Es soll also "2012-12-28  test3" angezeigt werden. Wie stelle ich das an?

    Warum stellst du die Frage im Themenbereich PHP ein, obwohl du selbst schon erkannt hast, dass es ein Datenbank-Thema ist?

    Ciao,
     Martin

    --
    Liebet eure Feinde - vielleicht schadet das ihrem Ruf.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo,

      In einer mysql-Datenbank habe ich verschiedene Termine gespeichert. Wie schaffe ich es, dass immer nur der chronologisch nächste angezeigt wird?

      _selektiere_ nur Einträge, deren Datum größer oder gleich dem aktuellen Datum ist; _sortiere_ sie aufsteigend nach Datum; _limitiere_ die Menge auf 1 (oder verwerte nur das erste Ergebnis).

      richtiger wäre es, den oder die(!) Einträge auszuwählen, die das kleinste Datum aufweisen, das größer ist als das aktuelle. Es könnten ja mehrere Termine am gleichen Tag sein. Falls nur ein Eintrag gewünscht ist, so müsste das Kriterium angegeben werden, nach dem bei Gleichheit entschieden wird.

      Freundliche Grüße

      Vinzenz

  2. Hi

    date        termin
    1999-03-31  test1
    2011-05-01  test2
    2012-12-28  test3
    2015-01-01  test4

    Es soll also "2012-12-28  test3" angezeigt werden. Wie stelle ich das an?
    Danke und Gruß peschels

    Erstmal musst du die Daten sortieren (ORDER BY)
    Dann interessiert dich nur der Teil ab jetzt (WHERE date >= NOW())
    Es interessiert dich auch nur der nächste Termin, nicht alle (LIMIT)

    Das sollte helfen.

    Gruß
    Alex

    1. Hi!

      Erstmal musst du die Daten sortieren (ORDER BY)
      Dann interessiert dich nur der Teil ab jetzt (WHERE date >= NOW())
      Es interessiert dich auch nur der nächste Termin, nicht alle (LIMIT)

      Die Reihenfolge ist etwas anders. Zuerst werden die Daten nach ihrem Suchkriterium eingeschränkt, dann die entstandene Datenmenge sortiert. Und in der Reihenfolge muss das auch im Statement notiert sein.

      Das DBMS kann übrigens intern sehr schön optimieren, wenn es für die Datumsspalte einen Index verwenden kann. Dann ist nämlich der Sortiervorgang nicht mehr erforderlich, das WHERE findet den Übergang zwischen < und >= schnell, und mit dem LIMIT muss nur noch einmal zugegriffen werden. Ohne Index muss die gesamte Tabelle nach passenden Daten durchforstet werden, die Sortierung ist notwendig und der Rest der Datensätze außer dem einen muss ungenutzt verworfen werden. (Die Statementsyntax bleibt aber die gleiche, egal ob das DBMS intern was optimieren kann oder nicht.)

      Lo!

      1. Erstmal musst du die Daten sortieren (ORDER BY)
        Dann interessiert dich nur der Teil ab jetzt (WHERE date >= NOW())
        Es interessiert dich auch nur der nächste Termin, nicht alle (LIMIT)

        Die Reihenfolge ist etwas anders. Zuerst werden die Daten nach ihrem Suchkriterium eingeschränkt, dann die entstandene Datenmenge sortiert. Und in der Reihenfolge muss das auch im Statement notiert sein.

        Danke erstmal für die schnelle Hilfe, habs auch gleich ausprobiert.
        $sql = "SELECT * FROM spielplan WHERE datum >= NOW() ORDER BY datum ASC";
        Dies funktioniert auch soweit, nur hat dies einen kleinen Hacken: Wenn der Termin am heutigen Tag ist, wird er nicht mehr und der nächstmögliche angezeigt. In der Datenbank liegt das Datum in folgendem Format vor:"yyyy-mm-dd" als Datentyp date.
        Woran kann das liegen?

        1. Hi!

          $sql = "SELECT * FROM spielplan WHERE datum >= NOW() ORDER BY datum ASC";
          Dies funktioniert auch soweit, nur hat dies einen kleinen Hacken: Wenn der Termin am heutigen Tag ist, wird er nicht mehr und der nächstmögliche angezeigt. In der Datenbank liegt das Datum in folgendem Format vor:"yyyy-mm-dd" als Datentyp date.
          Woran kann das liegen?

          Lass dir anzeigen, was NOW() liefert.

          (übrigens: Haken, nicht Hacken)

          Lo!

          1. Lass dir anzeigen, was NOW() liefert.

            (übrigens: Haken, nicht Hacken)

            und wie genau mache ich das?

            ps: ich wusste nicht, dass ich es mit einem Germanistik-Professor zu tun habe

            1. Hi,

              Lass dir anzeigen, was NOW() liefert.

              und wie genau mache ich das?

              Bspw. mit SELECT.

              (übrigens: Haken, nicht Hacken)

              ps: ich wusste nicht, dass ich es mit einem Germanistik-Professor zu tun habe

              Hast du auch nicht.
              Aber wenn du Haken und Hacken nicht unterscheiden kannst, wundert deine Fehlwahrnehmung an dieser Stelle auch nicht mehr.

              MfG ChrisB

              --
              RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            2. Hi!

              Lass dir anzeigen, was NOW() liefert.
              und wie genau mache ich das?

              Mit MySQL kann man beliebige Ausdrücke testen, indem man sie einfach hinter SELECT schreibt und dann nichts weiter, also ohne FROM etc.

              SELECT NOW()

              Lo!

            3. Hallo,

              Lass dir anzeigen, was NOW() liefert.

              und wenn Du das getan hast, willst Du lieber CURRENT_DATE (oder eines seiner Äquivalente) verwenden.

              Freundliche Grüße

              Vinzenz

              1. und wenn Du das getan hast, willst Du lieber CURRENT_DATE (oder eines seiner Äquivalente) verwenden.

                Tausend Dank, das isses! Jetzt funktioniert es, so wie ich es wollte. DANKESCHÖN an alle ...
                Gruß peschels

                1. Hi,

                  und wenn Du das getan hast, willst Du lieber CURRENT_DATE (oder eines seiner Äquivalente) verwenden.
                  Tausend Dank, das isses! Jetzt funktioniert es, so wie ich es wollte. DANKESCHÖN an alle ...

                  Nur um sicherzugehen: hast du auch verstanden, warum CURRENT_DATE() funktioniert und NOW() nicht?

                  Das liegt daran, dass beim Vergleich deines Datumsfelds (Datentyp Date) mit der Funktion NOW (Datentyp Datetime) das Datumsfeld auf Datetime ergänzt wird (mit Zeitangabe 00:00 Uhr). Somit liegt dann NOW() nach allen Tageinträgen vom gleichen Tag.

                  Bei CURRENT_DATE passiert genau das nicht.

                  Bis die Tage,
                  Matti

            4. Lass dir anzeigen, was NOW() liefert.

              (übrigens: Haken, nicht Hacken)

              und wie genau mache ich das?

              ps: ich wusste nicht, dass ich es mit einem Germanistik-Professor zu tun habe

              Das erklärt einiges - Germanistik hat mit Rechtschreibung nicht wirklich etwas zu tun.

              Also immer schön die Hacken zusammenschlagen :p