Berechnung der Zeitdifferenz zwischen 2 Daten in Minuten

78

Ich habe ein Zeitfeld Zeitstempel in meiner MySQL-Datenbank, das einem DATEDatentyp in meiner Bean zugeordnet ist. Jetzt möchte ich eine Abfrage, mit der ich alle Datensätze in der Datenbank abrufen kann, für die der Unterschied zwischen dem aktuellen und dem in der Datenbank gespeicherten Zeitstempel> 20 Minuten beträgt.

Wie kann ich es tun?

Was ich will ist:

SELECT * FROM MyTab T WHERE T.runTime - now > 20 minutes

Gibt es dafür MySQL-Funktionen oder eine Möglichkeit, dies in SQL zu tun?

Akshay
quelle
2
Versuchen Sie wirklich, Datensätze auszuwählen, deren Zeitstempel in Zukunft mindestens 20 Minuten beträgt? Denn genau das sagt die Bedingung in Ihrer Abfrage aus.
Ilmari Karonen

Antworten:

135

Ich denke, Sie könnten TIMESTAMPDIFF (unit, datetime_expr1, datetime_expr2) so etwas wie verwenden

select * from MyTab T where
TIMESTAMPDIFF(MINUTE,T.runTime,NOW()) > 20
Nicola Peluchetti
quelle
1
Wählen Sie * aus MyTab T, wobei TIMESTAMPDIFF (MINUTE, T.runTime, NOW ())> 20 (T.runTime ist die Coulmn der MyTab-Tabelle)
Dheeraj singh
es enthält nicht die zweite nur den Unterschied der Minute zeigen
Arpan
23
ROUND(time_to_sec((TIMEDIFF(NOW(), "2015-06-10 20:15:00"))) / 60);
Mouloud
quelle
13

Ich verwende den folgenden Code für heute und das Datenbankdatum.

TIMESTAMPDIFF(MINUTE,T.runTime,NOW()) > 20

Gemäß der Dokumentation kann das erste Argument eines der folgenden sein:

MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
Deepak Dholiyan
quelle
3
Wegen der% 60 ignorieren Sie Unterschiede, die größer als eine Stunde sind ...
SparK
@SparK ist korrekt, entfernen Sie die% 60, sonst erhalten Sie für 90 Minuten nur 30.
Buffalo
6

Probier diese:

select * from MyTab T where date_add(T.runTime, INTERVAL 20 MINUTE) < NOW()

HINWEIS: Dies sollte funktionieren, wenn Sie das MySQL DateTime-Format verwenden. Wenn Sie den Unix-Zeitstempel (Ganzzahl) verwenden, ist dies noch einfacher:

select * from MyTab T where UNIX_TIMESTAMP() - T.runTime > 20*60

Die Funktion UNIX_TIMESTAMP () gibt den aktuellen Unix-Zeitstempel zurück.

itsmeee
quelle
Ich weiß nicht, ob der Optimierer von MySQL klug genug ist, dies selbst zu tun, aber im Allgemeinen würde ich die erste Bedingung als neu schreiben T.runTime < DATE_SUB(NOW(), INTERVAL 20 MINUTES).
Ilmari Karonen
Warum ist der neu geschriebene Zustand Ihrer Meinung nach schneller als der ursprüngliche?
Es ist der
1
Es könnte nicht sein, wenn MySQL klug genug ist, aber in der Regel, wenn Sie auf einen Index haben t.col, dann t.col < func(const)sollte noch schneller sein , als , invfunc(t.col) < constweil die DB die rechte Seite vorberechnet und den Index verwenden.
Ilmari Karonen
@IlmariKaronen Dies schlägt bei mir fehl, wenn ich es verwende MINUTES, funktioniert aber, wenn ich es verwende MINUTE. Gemäß den MySQL-Dokumenten MINUTE wird von DATE_ADDund DATE_SUBin Version 5.5 erwartet . Funktioniert MINUTESin anderen Versionen?
Andrew Kozak
1
@ Andrew: Du hast recht, es sollte sein INTERVAL 20 MINUTE. Ich kann meinen Kommentar nicht mehr bearbeiten, um ihn zu beheben, aber ich kann (und habe es gerade getan) die Antwort bearbeiten.
Ilmari Karonen