2017-01-25 4 views
0

Bitte beachten Sie die folgende Abfrage:MySQL TIMEDIFF Rückkehr zu unerwarteten Ergebnissen

SELECT submitted_time FROM jobs WHERE timediff(NOW(), submitted_time) < '24:00:00' 

Meine Hoffnung ist, für das alle Zeilen zurückgeben, die eine „submitted_time“ Spalte enthält einen Zeitstempel aufweisen, die innerhalb der letzten 24 Stunden war ich jedoch bin die folgenden Ergebnisse empfangen:

2017-01-18 14:58:34 
2017-01-16 14:58:34 

Wenn ich die Abfrage SELECT NOW() laufen bekomme ich 2017-01-25 18:58:32

Welche scheint sei richtig.

Was Fremde immer noch ist, dass ich neuere Zeilen in der DB haben, wie:

2017-01-24 15:17:13 

Welche sind nicht zurückgegeben.

Ich hoffe, ich habe einen offensichtlichen Fehler gemacht, auf den jemand hinweisen kann, anstatt den Abstieg in den Wahnsinn zu beginnen.

+0

Sie können Datums- und Zeitstempelwerte direkt vergleichen. Es gibt keinen Grund, auf diese Weise Timediff zu machen. Innerhalb der letzten 24 Stunden würde einfach eine zwischenabfrage und die Verwendung von DATE_ADD involviert sein. Siehe hierzu: http://www.gizmola.com/blog/archives/51-Exploring-Mysql-CURDATE-und-NOW.-The-Same-But-Different..html – gview

+0

Vielen Dank für den Link, den ich nehmen werde schau jetzt mal und schau ob ich meine Anfrage anpassen kann, leider ist MySql nicht mein starker Anzug :) – Aphire

Antwort

1

Nur klar zu sein, ist die einfachste und wahrscheinlich am performant Weg zu handhaben ist (gemäß dem Link ich im Kommentar zur Verfügung gestellt)

SELECT submitted_time FROM jobs WHERE submitted_time > DATE_ADD(NOW(), INTERVAL -1 DAY); 

Dies sollte alle Aufträge buchstäblich innerhalb der letzten 24 Stunden vorgelegt werden im Moment wird die Abfrage ausgegeben.

Dies ist für diese Abfrage möglicherweise nicht wichtig, aber jedes Mal, wenn Sie Funktionen auf Spalten in Ihrer Tabelle anwenden, können eventuell vorhandene Indizes nicht verwendet werden, da die Datenbank die Funktion (en) für jeden Wert ausführen muss die Tabelle, bevor es einen Vergleich durchführen kann.

Mit dieser Methode ermitteln Sie, was die vergleichbare datetime sein muss, und mysql verwendet einen Index für submitted_time für den Vergleich, vorausgesetzt, dass die Spalte entsprechend indiziert ist.

+0

Das klappt perfekt, vielen Dank. Ich werde dir natürlich die richtige Antwort geben, aber ich werde ein paar Tage warten, um zu sehen, ob die Frage jemanden dazu bringt, genau herauszufinden, warum meine Anfrage für die Nachwelt nicht funktioniert hat. – Aphire

+0

Das Problem mit Ihrem ursprünglichen Versuch ist im Vergleich. Timediff gibt einen "Zeit" -Wert zurück. '24: 00: 00 'ist ein String, kein Zeitwert. Um den Vergleich durchzuführen, müssen Sie die Zeichenfolge mit einem CAST ('24: 00: 00 'AS time) auf einen Zeitwert setzen. Natürlich ist das sehr verwirrend und hat das Problem, dass ich keine Indizes verwende. – gview

Verwandte Themen