【问题标题】: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 分钟的记录吗?因为这就是您查询中的条件所说的。

标签: mysql sql timestamp


【解决方案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 &lt; DATE_SUB(NOW(), INTERVAL 20 MINUTES)
  • 为什么你认为重写的条件比初始条件快?
  • 如果 MySQL 足够聪明,可能不会,但一般来说,如果您在 t.col 上有索引,那么 t.col &lt; func(const) 应该比 invfunc(t.col) &lt; const 快,因为 DB 可以预先计算右侧并使用索引。
  • @IlmariKaronen 如果我使用MINUTES,这对我来说会失败,但如果我使用MINUTE,则可以。在 5.5 版中,the MySQL docs MINUTE 预计将由 DATE_ADDDATE_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()) &gt; 20

    According to the documentation,第一个参数可以是以下任意一种:

    MICROSECOND
    SECOND
    MINUTE
    HOUR
    DAY
    WEEK
    MONTH
    QUARTER
    YEAR
    

    【讨论】:

    • 由于 %60 您忽略了大于一小时的差异...
    • @SparK 是正确的,删除​​ %60,否则 90 分钟你只会得到 30。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2012-01-03
    • 2021-11-14
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多