RAINER: MySQL-Abfrage einschränken

Hallo,

mit

$abfrage = "SELECT * from $tab_termine ORDER by datum ASC";

lasse ich eine Tabelle ausgeben. Wie kann ich in diese Abfrage noch eine Einschränkung nach Monaten integrieren. Meine Datums-Spalte (datum) ist ein UNIX-Zeitstempel.

Ich dachte das geht so:

$abfrage = "SELECT * from $tab_termine WHERE date('m', 'datum') LIKE 'Juni' ORDER by datum ASC";

Leider funktioniert das aber nicht...

Wer kann mir helfe???

Danke, RAINER

  1. Halihallo Rainer

    $abfrage = "SELECT * from $tab_termine WHERE date('m', 'datum') LIKE 'Juni' ORDER by datum ASC";

    Das wäre auch nicht sehr performant, besser wäre:

    SELECT * FROM $tab_termine WHERE MONTH(datum) == 6 ORDER BY datum ASC

    Viele Grüsse

    Philipp

    1. Hi Philipp,

      leider läuft Deine Version auch nicht :-(((

      SELECT * FROM $tab_termine WHERE MONTH(datum) == 6 ORDER BY datum ASC

      Was nun???

      Rainer

      1. Was nun???

        Rainer

        Hallo Rainer,

        wie wärs mit Dokumentation lesen?

        Gruss

        Bernd

        1. Hi Bernd,

          habe ich versucht - klappt aber alles nicht ....

      2. Halihallo RAINER

        leider läuft Deine Version auch nicht :-(((

        Dann machst du was falsch (glaube ich zumindest). Was kommt denn für eine Fehlermeldung?
        date ist übrigens als Spalten-/Tabellennamen in ANSI SQL nicht erlaubt (obwohl in mysql schon), solltest du, wenn du auch andere DB's verwende(est|n) (willst) ändern.

        Viele Grüsse

        Philipp

        1. Hi Philipp,

          ich glaube es liegt an meinem Datumsformat.

          dies ist UNIX, also z.B. 1009839600.

          Kann es sein, dass der MONTH(datum) - Befehl damit nicht klarkommt? Sondern nur mit Datum im Format 2002-02-02 ???

          Wie kann ich das hinkriegen?

          Danke nochmal, RAINER

          1. Halihallo RAINER

            ich glaube es liegt an meinem Datumsformat.
            dies ist UNIX, also z.B. 1009839600.

            Dessen bin ich mir nicht ganz sicher:
            Ich glaube du musst die Daten in "normaler Form" speichern, also z. B. 2002-12-30, diese
            wird dann intern in eine Timestamp umgewandelt und als 32-bit Integer in der DB
            gespeichert. Ein Insert mit "date='1009839600'" kann evtl. zu falschen
            Typenkonvertierungen führen. Siehe dazu mal deine Tabelle, was steht dort bei normalem
            SELECT in der date Spalte?

            Kann es sein, dass der MONTH(datum) - Befehl damit nicht klarkommt? Sondern nur mit Datum im Format 2002-02-02 ???

            Nein. Timestamp-Columns sollten sich (in der Verarbeitung/Selektion) gleich wie alle anderen verhalten.

            Viele Grüsse

            Philipp

            1. Hallo nochmal,

              in der Spalte steht: 1009839600 - das wird dort eingefügt durch die time()-Funktion!

              Das Problem ist, ich kann das nicht mehr ändern ... die Tabelle ist einfach zu umfangreich und es hängen auchnoch andere Sachen mit dran, die Funktionieren, z.B. diese Abfrage

              $abfrage = "SELECT * from $tab_termine WHERE datum > UNIX_TIMESTAMP(curdate()) OR datum = UNIX_TIMESTAMP(curdate()) ORDER by datum LIMIT 0, 3";

              Da werde mir dann immer die letzten drei aktuellen Termine ausgegeben.

              Aber warum klappt das nicht wenn ich das auf Monate beschränken will ???

              Warum klappt WHERE MONTH(datum) = 8 nicht????

              Danke für Deine Geduld,
              Rainer

              1. Halihallo RAINER

                in der Spalte steht: 1009839600 - das wird dort eingefügt durch die time()-Funktion!

                OK. Das hat dann aber nur noch wenig mit dem mysql-Datentyp TIMESTAMP zu tun. Du
                solltest den Typ dann bei Gelegenheit in unsigned INT umwandeln.

                Aber warum klappt das nicht wenn ich das auf Monate beschränken will ???

                Naja, wie ich auch der von dir geposteten Lösung entnehme, setzt mysql den Integer nicht
                1:1 um, sondern versucht ihn als strinified-date zu interpretieren, das Ergebnis ist,
                dass der Typ nicht umgewandelt werden kann und in gegebener Form übernommen wird; das
                funktioniert zwar, nur mit dem Nachteil, dass man Date/Time-Funktionen nicht mehr
                verwenden kann (naja, verwenden kann man sie, nur spucken sie irrelevante Daten aus).

                Zu deiner Lösung: FROM_UNIXTIMESTAMP liest nun einen Integer ein (und der ist ja
                fälschlicherweise auch gespeichert) und konvertiert ihn in ein mysql-date-Typ. Dieser
                kann dann natürlich wieder von MONTH richtig umgesetzt werden.

                Viele Grüsse

                Philipp

            2. Hi,

              hab die Lösung !!!

              WHERE MONTH(FROM_UNIXTIME(datum)) = 8

              Danke nochmal,

              Rainer