mysql: Abfrage scheitert bei ungültigen Inhalten
bastold
- datenbank
Hallo!
Ich möchte in meine Datenbank Sätze eintragen, die auch ein Datum enthalten. Es kann sein, dass es Datumsfelder gibt, wo ich nur den Tag oder den Tag und Monat kenne, aber nicht das Jahr.
Ich trage dies dann so in die Spalte ein '0000-00-12' oder auch '0000-04-12'.
Ich möchte dann eine Ausgabe machen mit all den Sätzen, wo ich kein gültiges Datum habe und mache dazu ein
SELECT * FROM tabelle WHERE datumsfeld = '0000-00-12'
.
Mir werden dann 0 Sätze zurückgeliefert. Es kommt keine mysql-Fehlermeldung!
Ich dachte, das liegt evtl. an dem nicht korrekten Inhalt des Datumsfeldes.
Testweise habe ich dann einmal als Datum '1970-00-12' eingetragen, Wenn ich da aber ein SELECT * FROM tabelle WHERE datumsfeld = '1970-00-12'
ausführe, bekomme ich den Satz von der Datenbank zurückgeliefert.
Kann mir jemand sagen, warum das so ist bzw. wie ich auch Inhalte zurückerhalte, wenn ich das Jahr auf '0000' lasse?
Oder hat jemand eine Idee, wie ich Sätze speichere, bei denen ich das Jahr/ Monat nicht weiss, aber trotzdem das ganze in ein Feld vom Typ 'date' gespeichert werden soll?
Danke
Und ich habe eben noch getest, was passiert, wenn ich Tag und Monat mit gütligen Werten Belege, das Jahr aber auf '0000' belasse.
Auch dann erhalte ich den korrekten Satz zurückgeliefert.
Auch wenn ich sowas in das Datumsfeld eintrage, erhalte ich den korrekten Satz zurück '0000-00-00'.
Nur wenn Jahr und Monat auf '0' stehen, bekomme ich keine Zeile geliefert. Kann das sein?
Danke
Hi,
Nur wenn Jahr und Monat auf '0' stehen, bekomme ich keine Zeile geliefert. Kann das sein?
es kann sein. Ebenso gut kann sein, dass Du bei ungültigen Daten nur dann den Datensatz erhältst, wenn die Summe aus Jahr, Monat und Tag ohne Rest durch eine Primzahl teilbar ist. Oder wenn Vollmond ist. Das ist die Krux mit ungültigen Daten, die trotzdem akzeptiert werden: Ergebnisse sind willkürlich und nicht verlässlich.
Cheatah
ungültigen Daten, die trotzdem akzeptiert werden: Ergebnisse sind willkürlich und nicht verlässlich.
Ah ok, alles klar.
Vielen Dank. Muss ich mich mal anderweitig kümmern, wie ich sowas abgespeichert bekomme :)
Hi!
Nur wenn Jahr und Monat auf '0' stehen, bekomme ich keine Zeile geliefert. Kann das sein?
Kann ich mit 5.0.77 nicht nachvollziehen. '0000-00-08' im Feld und danach gesucht, bringt die entsprechende Zeile.
es kann sein. Ebenso gut kann sein, dass Du bei ungültigen Daten nur dann den Datensatz erhältst, wenn die Summe aus Jahr, Monat und Tag ohne Rest durch eine Primzahl teilbar ist. Oder wenn Vollmond ist. Das ist die Krux mit ungültigen Daten, die trotzdem akzeptiert werden: Ergebnisse sind willkürlich und nicht verlässlich.
Das ist nicht wirklich witzig, denn im üblichen Kontext wären zwar Datumsangaben mit 0 ungültig, im MySQL-Kontext sind sie es aber nicht. Denn damit lassen sich Angaben wie 2001-08-00 speichern, die bedeuten, dass man Monat und Jahr kennt/angibt, aber den Tag nicht weiß oder er keine Rolle spielt. Das ist quasi wie NULL mitten im Feld. Für manche würde das ein Fehler sein, und sie würden das Datum in dem Fall auf drei Felder aufteilen, andere sehen in diesem dokumentierten und gewollten Verhalten den Vorteil, den das System bringt, aber auch, dass das nachteilig sein kann, wenn man keine im normalen Kontext ungültigen Datumswerte haben möchte. Dann kann man immer noch dieses Verhalten abschalten.
Lo!
Hi,
Mir werden dann 0 Sätze zurückgeliefert. Es kommt keine mysql-Fehlermeldung!
ja, manchmal ist die "ich mach' einfach mal was"-Einstellung bei MySQL ziemlich nervig.
Ich dachte, das liegt evtl. an dem nicht korrekten Inhalt des Datumsfeldes.
Korrekt. In http://dev.mysql.com/doc/refman/5.1/de/datetime.html erfährst Du, welche Zeiträume unterstützt werden.
Kann mir jemand sagen, warum das so ist bzw. wie ich auch Inhalte zurückerhalte, wenn ich das Jahr auf '0000' lasse?
Es wäre in der Tat sinnvoll, wenn MySQL dieses Datum mit einem Fehler ablehnen würde. Dies geschieht nicht. Das Datum ist ungültig, es ist also kein definiertes oder vorhersehbares Verhalten zu erwarten.
Cheatah
Hi!
ja, manchmal ist die "ich mach' einfach mal was"-Einstellung bei MySQL ziemlich nervig.
Niemand hindert dich, MySQL in einen standardkonformen Modus umzuschalten.
Es wäre in der Tat sinnvoll, wenn MySQL dieses Datum mit einem Fehler ablehnen würde. Dies geschieht nicht.
Diese Aussage ist nicht richtig. Siehe oben.
Das Datum ist ungültig, es ist also kein definiertes oder vorhersehbares Verhalten zu erwarten.
Lo!
Ok, das verwirrt mich jetzt alles.
Also vor allen Dingen, dass bei dir die Abfrage mit dem 0-er Jahr und Monat geht.
Ich speicher jetzt den Tag/ Monat/ Jahr in Extrafelder, damit sollte ich auf der sicheren Seite sein. Ist dann zwar bei der Ausgabe etwas müssig, aber was solls ...
Danke euch beiden!