Frankie: MYSQL DATETIME-Feld Zeitspanne eingrenzen klappt nicht o(

Moin,
ich krich voll die Krise ...

Ich habe in MYSQL eine datetime-Spalte namens Datum,
im Ist-nu-ja-mal-so-Format: YYYY-MM-DD HH:MM:SS

Ich möchte bei der Abfrage einen Zeitbereich eingrenzen.
Funktioniert soweit auch gut.

CODE Bsp.:
---------------
$von = "2005-03-11 00:00:00";
$tage = "10";
... select * from table WHERE TO_DAYS('$von') - TO_DAYS(Datum) <= $tage ...
---------------

Klappt echt gut,
und die Abfrage bringt mir den Zeitraum vom 01.-11.03.

Aber wenn ich von auf "2005-02-11..." setze
( aus der Zeit gibt's noch gar keine Datensätze ),
dann liefert MYSQL mir ALLE VORHANDENEN anstatt KEINE ...

Ich habe Null-Peilung.
Wieso ist das so?
Wie kann ich das abstellen?

Besten Dank, Frank

  1. Hi,

    ... select * from table WHERE TO_DAYS('$von') - TO_DAYS(Datum) <= $tage ...
    Aber wenn ich von auf "2005-02-11..." setze
    ( aus der Zeit gibt's noch gar keine Datensätze ),
    dann liefert MYSQL mir ALLE VORHANDENEN anstatt KEINE ...

    was passiert, wenn Du von einem Wert x einen größeren Wert x+n abziehst? Betrachte bei Deiner Antwort bitte besonders den Punkt, ob das Ergebnis kleiner als ein (beliebiger) positiver Wert ist.

    Wie kann ich das abstellen?

    Beschäftige Dich mit dem BETWEEN-Operator.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi Cheatah

      was passiert, wenn Du von einem Wert x einen größeren Wert x+n abziehst? Betrachte bei Deiner Antwort bitte besonders den Punkt, ob das Ergebnis kleiner als ein (beliebiger) positiver Wert ist.

      Blick ich nicht.
      Sind doch auch nur 10 Tage abgezogen.
      Aber warum checkt MYSQL nicht,
      dass es in dem Zeitraum keine Datensätze gibt? *grübel*

      Beschäftige Dich mit dem BETWEEN-Operator.

      Danke
      Gruss, Frankie

      1. Hi,

        Sind doch auch nur 10 Tage abgezogen.

        nein, an keiner Stelle ziehst Du zehn Tage ab. Es sei denn, irgendwo in der Tabelle hast Du ein Datum gespeichert, welches zehn Tage nach dem in MySQL definierten Nullpunkt war.

        Aber warum checkt MYSQL nicht,
        dass es in dem Zeitraum keine Datensätze gibt? *grübel*

        Weil Du keine Datensätze in einem Zeitraum suchst.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi Cheatah,
          ist nicht leicht zu blicken,
          die BETWEEN Erklärung auf http://dev.mysql.com/doc/mysql/de/comparison-operators.html

          Ich sach' ma' einfach GLÜCK GEHABT
          mit "WHERE Datum BETWEEN ..."

          Scheint zu laufen *freu*
          Aber hättest' Du es mir nicht ein bischen einfacher machen können?
          Ich hab' halt kein Informatik-Studium absolviert.

          Aber Besten Dank !!!, hat geklappt o)
          Gruss Frankie

          1. Hi,

            ist nicht leicht zu blicken,

            eigentlich schon - es liest sich recht natürlich.

            Aber hättest' Du es mir nicht ein bischen einfacher machen können?

            Nein, denn:

            Ich hab' halt kein Informatik-Studium absolviert.

            Eben. Umso mehr unerlernte Fähigkeiten kannst Du nachholen.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
    2. Hallo,

      ... select * from table WHERE TO_DAYS('$von') - TO_DAYS(Datum) <= $tage ...
      Aber wenn ich von auf "2005-02-11..." setze
      ( aus der Zeit gibt's noch gar keine Datensätze ),
      dann liefert MYSQL mir ALLE VORHANDENEN anstatt KEINE ...
      was passiert, wenn Du von einem Wert x einen größeren Wert x+n abziehst? Betrachte bei Deiner Antwort bitte besonders den Punkt, ob das Ergebnis kleiner als ein (beliebiger) positiver Wert ist.

      Bist Du sicher, dass _dies_ die Ursache für das Verhalten von MySQL ist?

      Wie ich das verstanden habe, ist $von ein gültiger Datumswert (11.02.2005) und Datum ein Date-Time-MySQL-Datenfeld mit Inhalt NULL. Dann wäre

      ... WHERE TO_DAYS('$von') - TO_DAYS(Datum) <= $tage ...
      ... WHERE TO_DAYS('2005-02-11') - TO_DAYS(NULL) <= $tage ...

      Wo wird da "von einem Wert x ein größerer Wert x+n" abgezogen?

      Ich denke, es liegt daran, dass der Wert NULL dazu führt, dass der gesamte Ausdruck hinter WHERE zu NULL wird. Offensichtlich wird alles außer 0, also auch NULL, hinter WHERE als true betrachtet. Der Ausdruck WHERE NULL wird also wie WHERE 1 betrachtet. Es werden alle Datensätze ausgeliefert.

      viele Grüße

      Axel

      1. Hi,

        Bist Du sicher, dass _dies_ die Ursache für das Verhalten von MySQL ist?

        natürlich nicht, die Fehlerbeschreibung ist schließlich hinreichend ausbaufähig.

        Wie ich das verstanden habe, ist $von ein gültiger Datumswert (11.02.2005) und Datum ein Date-Time-MySQL-Datenfeld mit Inhalt NULL.

        Zum Beispiel wurde das Datumsfeld gar nicht beschrieben. Ich bezweifle aber, dass

        ... WHERE TO_DAYS('2005-02-11') - TO_DAYS(NULL) <= $tage ...

        dies gelten kann, denn TO_DAYS() eines aktuellen Datums wird keinen Wert ergeben, der sehr nahe an TO_DAYS(NULL) liegt, so dass die Differenz dieser beiden Funktionen kaum kleiner gleich 10 sein kann.

        Wo wird da "von einem Wert x ein größerer Wert x+n" abgezogen?

        Da, wo die Spalte "Datum" einen Zeitpunkt enthält, der nach dem 11. Februar diesen Jahres liegt.

        Ich denke, es liegt daran, dass der Wert NULL dazu führt, dass der gesamte Ausdruck hinter WHERE zu NULL wird.

        Steht das in der MySQL-Doku?

        Offensichtlich wird alles außer 0, also auch NULL, hinter WHERE als true betrachtet.

        Hm, das halte ich für ein Gerücht.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo,

          Ich bezweifle aber, dass

          ... WHERE TO_DAYS('2005-02-11') - TO_DAYS(NULL) <= $tage ...

          dies gelten kann, denn TO_DAYS() eines aktuellen Datums wird keinen Wert ergeben, der sehr nahe an TO_DAYS(NULL) liegt

          TO_DAYS(NULL) ist laut MySQL-Reference nicht definiert.
          http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
          ...
          TO_DAYS(date)

          Given a date date, returns a daynumber (the number of days since year 0).
          ...
          For other dates before 1582, results from this function are undefined.
          ...

          Die Operation (1 - NULL) ergibt laut MySQL-Reference NULL.
          http://dev.mysql.com/doc/mysql/en/arithmetic-functions.html

          Der Vergleich (NULL <= 1) ergibt laut MySQL-Reference NULL
          http://dev.mysql.com/doc/mysql/en/comparison-operators.html

          Je nachdem, was "undefiniert" bedeutet, bleibt hinter dem WHERE eben "undefiniert" oder NULL übrig.

          viele Grüße

          Axel

        2. Hallo,

          Wo wird da "von einem Wert x ein größerer Wert x+n" abgezogen?
          Da, wo die Spalte "Datum" einen Zeitpunkt enthält, der nach dem 11. Februar diesen Jahres liegt.

          Nach nochmaligem Lesen des Ausgangspostings, speziell:

          $von = "2005-03-11 00:00:00";
          $tage = "10";
          ... select * from table WHERE TO_DAYS('$von') - TO_DAYS(Datum) <= $tage ...
          Klappt echt gut,

          Aber wenn ich von auf "2005-02-11..." setze

          gebe ich zu, dass ich mich geirrt habe. Ich ging davon aus, dass
          die Aussage "In diesem Zeitraum gab es noch gar keine Einträge." sich auf zukünftige Datumswerte, also NULL-Werte im Feld Datum, bezog. Er fragt ja aber in $von ein vergangenes Datum ab und es gibt offensichtlich gar keine NULL-Werte im Feld Datum. Damit lieferen natürlich alle Werte in Datum, die später als $von sind, bei TO_DAYS('$von') - TO_DAYS(Datum) negative Werte, die dann _immer_ <= 10 sind.

          Offensichtlich wird alles außer 0, also auch NULL, hinter WHERE als true betrachtet.
          Hm, das halte ich für ein Gerücht.

          Ist es auch. Getestet unter MySQL 4.0.18 ergibt:
          TO_DAYS(NULL)   -> NULL
          1 - NULL        -> NULL
          NULL <= 10      -> NULL
          aber

          WHERE NULL
          immer ein leeres Resultset.

          viele Grüße

          Axel