Обчислення різниці в часі між двома датами в хвилинах


79

У моїй базі даних MySQL є часовий знак часу, який відображається у DATEтипі даних у моєму файлі. Тепер я хочу запит, за допомогою якого я можу отримати всі записи в базі даних, для яких різниця між поточною позначкою часу та записом, що зберігається в базі даних, становить> 20 хвилин.

Як я можу це зробити?

Що я хочу, це:

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

Чи існують якісь функції MySQL для цього, або будь-який спосіб зробити це в SQL?


2
Ви справді намагаєтесь вибрати записи, позначка часу яких становитиме принаймні 20 хвилин у майбутньому? Тому що саме про це говорить умова у вашому запиті.
Ілмарі Каронен

Відповіді:


136

Я думаю, ви могли б використовувати TIMESTAMPDIFF (одиниця, datetime_expr1, datetime_expr2) щось на зразок

select * from MyTab T where
TIMESTAMPDIFF(MINUTE,T.runTime,NOW()) > 20

1
виберіть * з MyTab T, де TIMESTAMPDIFF (MINUTE, T.runTime, NOW ())> 20 (T.runTime - це частина таблиці MyTab)
Dheeraj singh

вона не включає другу лише різницю в хвилинах
Арпан


14

Я використовую наведений нижче код на сьогодні та дату бази даних.

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

Згідно з документацією , першим аргументом може бути будь-що з наступного:

MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR

3
Через 60% ви ігноруєте відмінності, більші за одну годину ...
SparK

@SparK правильний, видаліть% 60, інакше протягом 90 хвилин ви отримаєте лише 30.
Буффало

6

Спробуйте це:

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

ПРИМІТКА: це має спрацювати, якщо ви використовуєте формат MySQL DateTime. Якщо ви використовуєте Unix Timestamp (ціле число), то це було б ще простіше:

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

Функція UNIX_TIMESTAMP () повертає вам поточну мітку часу Unix.


Я не знаю, наскільки оптимізатор MySQL достатньо розумний, щоб зробити це сам по собі, але за загальним принципом я б переписав першу умову як T.runTime < DATE_SUB(NOW(), INTERVAL 20 MINUTES).
Ilmari Karonen

чому, на вашу думку, переписаний стан швидший за початковий?
itsmeee

1
Це може бути не так, якщо MySQL досить розумний, але загалом, якщо у вас індекс t.col, то це t.col < func(const)має бути швидше, ніж invfunc(t.col) < constтому, що БД може попередньо обчислити праву частину та використовувати індекс.
Ілмарі Каронен

@IlmariKaronen Це не вдається для мене, якщо я використовую MINUTES, але працює, якщо я використовую MINUTE. За MySQL в документації MINUTE очікується DATE_ADDі DATE_SUBв версії 5.5. Чи MINUTESпрацює в інших версіях?
Ендрю Козак,

1
@Andrew: Ви маєте рацію, так і повинно бути INTERVAL 20 MINUTE. Я не можу більше редагувати свій коментар, щоб виправити це, але я можу (і щойно зробив) редагувати відповідь.
Ilmari Karonen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.