以分钟为单位计算两个日期之间的时差


78

我的MySQL数据库中有一个Timestamp字段,它映射到DATEbean中的数据类型。现在,我想要一个查询,通过该查询可以获取数据库中的所有记录,这些记录的当前时间戳和存储在数据库中的时间戳之间的差异> 20分钟。

我该怎么做?

我想要的是:

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

是否有任何MySQL函数可用于此目的,或有任何方法可以在SQL中做到这一点?


2
您是否真的要选择时间戳记至少为20分钟的记录?因为这就是查询中的条件。
Ilmari Karonen 2011年

Answers:



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

12

我今天和数据库日期使用下面的代码。

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

根据文档,第一个参数可以是以下任意一个:

MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR

3
由于%60,您忽略了大于一小时的差异...
SparK

@SparK是正确的,删除​​%60,否则在90分钟内您只会得到30。–
Buffalo

6

试试这个:

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

注意:如果您使用的是MySQL DateTime格式,则此方法应该有效。如果您使用的是Unix时间戳记(整数),那么它将更加容易:

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 2011年

您为什么认为重写条件比初始条件要快?
itsmeee 2011年

1
如果MySQL足够聪明,则可能不是这样,但是总的来说,如果您在上有一个索引t.col,则t.col < func(const)应该比invfunc(t.col) < const数据库可以预先计算右侧并使用索引的速度更快。
Ilmari Karonen 2011年

@IlmariKaronen如果我使用MINUTES,这对我来说是失败的,但是如果我使用,则可以MINUTE。每个MySQL的文档 MINUTE被预期DATE_ADDDATE_SUB在版本5.5。是否MINUTES在其他版本的工作?
安德鲁·科扎克

1
@安德鲁:你是对的,应该是INTERVAL 20 MINUTE。我无法再编辑我的评论来解决它,但是我可以(并且刚刚)编辑答案。
Ilmari Karonen 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.