tomgk: MySQL: Timesat

Hallo!

Ich bin gerade dabei, ein Event-System zu Programmieren.
Die Daten werden dan in einer MySQL-DB gespeichert, Datum und Uhrzeit im Feld eventdatum.
Die Events werden dann auf einer Seite aufgelistet, aber ich möchte nur aktuelle Events anzeigen lassen.

Es sollten nur die selektiert werden, dessen Datum im Bereich von heute bis in einen Jahr ist.
Die Abfrage habe ich schon, nur weis ich nicht wie ich die WHERE-Klausel formulieren soll.

MfG
tomgk

--
Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(
  1. Hello,

    Die Abfrage habe ich schon, nur weis ich nicht wie ich die WHERE-Klausel formulieren soll.

    Mit Hilfe geeigneter Date-/Timefunctions, z.B. DATE_ADD und einem entsprechenden BETWEEN

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    There's no such thing as a free lunch  --  Milton Friedman
    1. Hallo!

      Mit Hilfe geeigneter Date-/Timefunctions, z.B. DATE_ADD und einem entsprechenden BETWEEN

      Stimmts so?: WHERE eventdatum BETWEEN CURDATE() AND DATE_SUB(CURDATE(),INTERVAL 1 YEAR)

      MfG
      tomgk

      --
      Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(
      1. Hallo!

        Hab folgendes zusammengebracht, was funktioniert: ... WHERE eventdatum BETWEEN DATE(NOW()) AND DATE_ADD(NOW(),INTERVAL 1 YEAR);
        Gibt es eine bessere Lösung oder ist die Lösung OK?

        MfG
        tomgk

        --
        Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(
        1. echo $begrüßung;

          Hab folgendes zusammengebracht, was funktioniert: ... WHERE eventdatum BETWEEN DATE(NOW()) AND DATE_ADD(NOW(),INTERVAL 1 YEAR);
          Gibt es eine bessere Lösung oder ist die Lösung OK?

          Sieht in Ordnung aus. Trotzdem ein paar kleine Anmerkungen: DATE(NOW()) liefert das selbe wie CURDATE(), nur aufwendiger. Statt DATE_ADD(..) kann man auch

          NOW() + INTERVAL 1 YEAR

          notieren. Und statt NOW() wäre CURDATE() korrekter. Allerdings spielt die Ungenauigkeit der Differenz zwischen einem Wert mit und einem ohne Uhrzeit bei einem Endtermin in Jahresfrist sicher keine gravierende Geige.

          echo "$verabschiedung $name";

          1. Hallo!

            Sieht in Ordnung aus. Trotzdem ein paar kleine Anmerkungen: DATE(NOW()) liefert das selbe wie CURDATE(), nur aufwendiger.

            Habs bereits geändert!

            MfG
            tomgk

            --
            Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(
      2. Hello,

        Stimmts so?: WHERE eventdatum BETWEEN CURDATE() AND DATE_SUB(CURDATE(),INTERVAL 1 YEAR)

        funktionierts so?
        Wolltest du nicht ein Jahr in die Zukunft? Warum dann DATE_SUB? Zumal ich meine Zweifel habe, dass "BETWEEN from AND to" gut darauf reagiert, wenn from>to ist.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Konsens ist kein Beweis  --  John Naisbitt
        1. Hallo!

          Wolltest du nicht ein Jahr in die Zukunft? Warum dann DATE_SUB? Zumal ich meine Zweifel habe, dass "BETWEEN from AND to" gut darauf reagiert, wenn from>to ist.

          Entschuldigung, ich habe aus irgendeinem Grund hier DATE_SUB geschrieben, in meinem Script aber DATE_ADD.
          Dann ist from<to.

          MfG
          tomgk

          --
          Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(
  2. Hallo!

    Ich möchte das die Events auch in richtiger Reihenfolde sind.
    Der nächste Event soll als 1. und der in einem Jahr als lezter sein.
    Allerdings ist die Reihenfolge genau andersrum. ORDER BY hilft auch nicht.
    Liegt das an der Bedingung?

    MfG
    tomgk

    --
    Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(
    1. echo $begrüßung;

      Ich möchte das die Events auch in richtiger Reihenfolde sind.

      Was unter "richtiger Reihenfolge" zu verstehen ist, musst du erst einmal definieren. Grundsätzlich ist definiert, dass Daten unsortiert zurückgegeben werden, wenn kein Sortierkriterium angegeben wurde.

      Der nächste Event soll als 1. und der in einem Jahr als lezter sein.
      Allerdings ist die Reihenfolge genau andersrum. ORDER BY hilft auch nicht.
      Liegt das an der Bedingung?

      Die WHERE-Klausel sagt nur aus, welche Daten überhaupt zur Bildung der Ergebnismenge herangezogen werden. Eine Reihenfolge ist dabei nicht definiert. Diese wird erst explizit durch ORDER BY oder implizit durch ein GROUP BY festgelegt. ORDER BY (und GROUP BY) wird auch erst nach Abschluss der WHERE-Klausel berücksichtigt (von vom DBMS selbständig vorgenommenen und nach außen hin nicht sichtbaren Optimierungen mal abgesehen)

      Ich kann aufgrund deiner Information nur vermuten, dass du da irgendwas falsch machst. Normalerweise führt eine Sortierung nach dem Datum zum Erfolg, wobei seine Rohform und nicht eine zur genehmeren Anzeige vorgenommene Formatierung als Sortierkriterium verwendet werden muss.

      echo "$verabschiedung $name";

      1. yo,

        Diese wird erst explizit durch ORDER BY oder implizit durch ein GROUP BY festgelegt.

        das ist meines wissens nur bei mysql so, also nicht zu verallgemeinern.

        Ilja

        1. Moin!

          »» Diese wird erst explizit durch ORDER BY oder implizit durch ein GROUP BY festgelegt.

          das ist meines wissens nur bei mysql so, also nicht zu verallgemeinern.

          Wenn man bei MySQL das implizite Sortieren durch GROUP BY aus Performancegründen (und weil die Sortierung nicht benötigt wird) verhindern möchte, muss man explizit ORDER BY NULL hinzufügen.

          - Sven Rautenberg

          1. yo,

            Wenn man bei MySQL das implizite Sortieren durch GROUP BY aus Performancegründen (und weil die Sortierung nicht benötigt wird) verhindern möchte, muss man explizit ORDER BY NULL hinzufügen.

            sicherlich nicht, da eine sortierung bei einer gruppierung immer zwingend erforderlich ist. insofern kann man sich diese aus performance gründen auch nicht sparen. mysql gibt aber bei einer sortierung auch die daten in der sortierung der gruppierung aus. und das macht nicht jedes dbms.

            Ilja

      2. Hallo!

        Ich kann aufgrund deiner Information nur vermuten, dass du da irgendwas falsch machst.

        Entschuldigung, ich hab fälschlicherweise das ORDER BY in andere MySQL-Abfrage geschrieben. Jetzt wo ich das geändert habe, sind sie in der richtigen Reihenfolge.

        MfG
        tomgk

        --
        Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(