以分钟为单位计算两个日期之间的时间差
Posted
技术标签:
【中文标题】以分钟为单位计算两个日期之间的时间差【英文标题】:Calculating time difference between 2 dates in minutes 【发布时间】:2011-11-29 23:57:43 【问题描述】:我的 mysql 数据库中有一个时间戳字段,它映射到我的 bean 中的 DATE
数据类型。现在我想要一个查询,通过它我可以获取数据库中当前时间戳与存储在数据库中的时间戳之间的差异大于 20 分钟的所有记录。
我该怎么做?
我想要的是:
SELECT * FROM MyTab T WHERE T.runTime - now > 20 minutes
是否有任何 MySQL 函数可以做到这一点,或者在 SQL 中有什么方法可以做到这一点?
【问题讨论】:
您真的要选择时间戳在未来至少 20 分钟的记录吗?因为这就是您查询中的条件所说的。 【参考方案1】:我认为你可以使用 TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2) 之类的东西
select * from MyTab T where
TIMESTAMPDIFF(MINUTE,T.runTime,NOW()) > 20
【讨论】:
select * from MyTab T where TIMESTAMPDIFF(MINUTE,T.runTime,NOW()) > 20(T.runTime是MyTab表的coulmn) 不包括秒只显示分钟的差异【参考方案2】:试试这个:
select * from MyTab T where date_add(T.runTime, INTERVAL 20 MINUTE) < NOW()
注意:如果您使用 MySQL DateTime 格式,这应该可以工作。如果你使用的是 Unix Timestamp (integer),那就更简单了:
select * from MyTab T where UNIX_TIMESTAMP() - T.runTime > 20*60
UNIX_TIMESTAMP() 函数返回当前的 unix 时间戳。
【讨论】:
我不知道 MySQL 的优化器是否足够聪明,可以自己做到这一点,但总的来说,我会将第一个条件重写为T.runTime < DATE_SUB(NOW(), INTERVAL 20 MINUTES)
。
为什么你认为重写的条件比初始条件快?
如果 MySQL 足够聪明,可能不会,但一般来说,如果您在 t.col
上有索引,那么 t.col < func(const)
应该比 invfunc(t.col) < const
快,因为 DB 可以预先计算右侧并使用索引。
@IlmariKaronen 如果我使用MINUTES
,这对我来说会失败,但如果我使用MINUTE
,则可以。在 5.5 版中,the MySQL docs MINUTE
预计将由 DATE_ADD
和 DATE_SUB
提供。 MINUTES
可以在其他版本中使用吗?
@Andrew:你说得对,应该是INTERVAL 20 MINUTE
。我无法再编辑我的评论来修复它,但我可以(并且刚刚)编辑了答案。【参考方案3】:
ROUND(time_to_sec((TIMEDIFF(NOW(), "2015-06-10 20:15:00"))) / 60);
【讨论】:
【参考方案4】:我在今天和数据库日期使用下面的代码。
TIMESTAMPDIFF(MINUTE,T.runTime,NOW()) > 20
According to the documentation,第一个参数可以是以下任意一种:
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
【讨论】:
由于 %60 您忽略了大于一小时的差异... @SparK 是正确的,删除 %60,否则 90 分钟你只会得到 30。以上是关于以分钟为单位计算两个日期之间的时间差的主要内容,如果未能解决你的问题,请参考以下文章