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?


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:



23
ROUND(time_to_sec((TIMEDIFF(NOW(), "2015-06-10 20:15:00"))) / 60);

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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.