MYSQL DATETIME-Feld Zeitspanne eingrenzen klappt nicht o(
Frankie
- datenbank
0 Cheatah0 Frankie0 Cheatah0 Danke
Frankie0 Cheatah
0 Axel Richter0 Cheatah
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
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
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
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
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
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
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
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
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
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