Mysql-Fehler 1292, Problem mit Time-Format?

Hallo,
ich habe in einer Mysql-Tabelle ein Feld namens Datum im Format „date“, nicht NULL.
Dieses Feld wird bisher dazu benutzt, Datensätze erst ab einem bestimmten Datum, 0 Uhr, anzuzeigen.
Jetzt hätte ich gerne, dass er die Daten erst ab 12 Uhr Mittags anzeigt.
D.h. ich kann die bisherige Abfrage mit TO_DAYS(NOW()) - TO_DAYS(a.datum) >=0 nicht mehr verwenden, sondern muss das Ganze mit Sekunden machen:

Die 12 Stunden hänge ich mit concat an das Datumsfeld a.datum an:
TIME_TO_SEC(TIMEDIFF(NOW(), concat(a.datum,’ 12:00:00’)))) > 43200

Weil jetzt eine Fehlermeldung kommt, die sagt, dass Mysql mit dem normalen Datumsformat Probleme hat, verwende ich STR_TO_DATE:
TIME_TO_SEC(TIMEDIFF(NOW(), STR_TO_DATE(concat(a.datum,’ 12:00:00’), ‚%Y-%m-%d %H:%i:%s‘))) > 43200

Das scheint zwar zu funktionieren, PhpMyAdmin spuckt aber für jeden Datensatz ein
1292 - incorrect date value bzw. die deutsche Meldung dazu aus.
Es macht auch keinen Unterschied, wenn ich das Datum von date auf datetime ändere. Der Fehler kommt trotzdem.

Wo ist da ein Fehler? Danke.
Ich fand auf Google keine vernünftige Antwort dazu.

P.S: die 2 Kommata vor %Y sind kein Eingabefehler von mir, sondern ein Fehler vom Wer-weiss-was-Editor. Da gehört nur eines hin, aber das lässt sich nicht sauber ändern.

Hallo!

Mir ist nicht klar, was genau du bezweckst. Dein

TO_DAYS(NOW()) - TO_DAYS(a.datum) >=0

ist ja TRUE für alle a.datum die nicht neuer als heute Abend, Mitternacht sind.

Des Weiteren ist dieses Gestückele mit Strings nicht wirklich schön, und vermutlich nicht besonders performant - für jeden einzelnen Eintrag in der Tabelle muss a.datum mühselig umgerechnet werden. Es ist deutlich besser, wenn du das wahre Filterkriterium berechnest, und dieses dann direkt mit a.datum vergleichst.

Beispielsweise so:

SELECT ... WHERE a.datum > DATE_SUB(DATE(NOW()), INTERVAL 12 HOUR)

DATE(NOW()) liefert das heutige Datum, von dem dann 12 Stunden abgezogen werden - dabei kommt der Zeitstempel „gestern, 12:00“ raus. Und diese Abfrage liefert nun alle Einträge seit gestern, 12:00.

Angeblich schaltet Accent Grave um kritische Zeichen die w-w-w Automatik aus.

Mit Accent: Er sagte "Hallo" ohne Accent: Er sagte „Hallo“

Problem nicht verstanden, Uhrzeit-Information ist in date nicht vorhanden, danach kannst du nicht selektieren. Du brauchst ein datetime Feld oder ein int(11), in dem du die Sekunden speicherst.

1 Like

Danke, aber das liefert nur ein leeres Ergebnis.
Außerdem brauche ich nicht die Einträge seit gestern, sondern es darf erst ab dem in a.datum festgelegten Datum ab 12 Uhr Mittags sichtbar sein.
Mit DATE_SUB und DATE_ADD hatte ich vorher schon probiert, aber weil das nicht geklappt hat, deshalb meine umständliche Lösung.

Weil die Uhrzeit in date nicht vorhanden ist, deshalb füge ich sie ja mit concat dazu.

Ich glaub ich habs jetzt gefunden:
AND a.datum < DATE_ADD(DATE(NOW()), INTERVAL 12 HOUR)
scheint gut zu funktionieren.
Wenn das gespeicherte Datum < ist als das aktuelle Datum + 12 Stunden, dann zeige an.
Wäre mit SUB auch gegangen, aber dann hätte ich wahrscheinlich datum und now() vertauschen müssen.

Hi!

Das heißt also:

Vor 12 Uhr mittags zeige nur Einträge bis inklusive heute, nach 12 Uhr mittags Zeige auch alle Einträge von morgen. Denn deine Tabelle hat ja keine Stunden und Minuten.

Also, es sei denn, statt NOW() gibt es noch ne andere Tabelle, aus der die Daten gezogen werden.

Ich gebe zu, so 100%ig habe ich das noch nicht verstanden.
Soll sein: Die Beiträge sollen erst ab dem in a.datum stehenden Datum, 12 Uhr mittags sichtbar sein.

oder müsste es a.datum <= DATE_ADD heißen?