MySQL 日期时间差异(以天、小时和分钟为单位)

Alt*_*tex 2 mysql datetime

我需要两个日期之间的天数、小时数和分钟数的差异。当前日期 (NOW()) 和结束日期。我需要它们在两个不同的查询中,它们的工作方式略有不同。

第一个需要以以下格式将它们作为单列返回:

-------------------------
|       time_left       |
-------------------------
| x days x hours x min  |
-------------------------
Run Code Online (Sandbox Code Playgroud)

第二个需要在三个单独的列中返回它们,确保如果 end_date 超过当前日期,则每列返回 0:

-------------------------------------------
|  days_left  |   hrs_left  |   min_left  |
-------------------------------------------
|      x      |      x      |      x      |
-------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我有一个解决方案来解决所有这些问题,但这很糟糕。我确信有人至少找到了一种相对干净的方法来解决这个问题。先谢谢了!

小智 5

之前的那个不准确,显示了一天零三个小时,而应该是一小时。

这个在任何时候都应该是准确的

SELECT 
    @diff:=ABS( UNIX_TIMESTAMP("2014-05-09 21:24:25") - UNIX_TIMESTAMP() ) , 
    CAST(@days := IF(@diff/86400 >= 1, floor(@diff / 86400 ),0) AS SIGNED) as days, 
    CAST(@hours := IF(@diff/3600 >= 1, floor((@diff:=@diff-@days*86400) / 3600),0) AS SIGNED) as hours, 
    CAST(@minutes := IF(@diff/60 >= 1, floor((@diff:=@diff-@hours*3600) / 60),0) AS SIGNED) as minutes, 
    CAST(@diff-@minutes*60 AS SIGNED) as seconds;
Run Code Online (Sandbox Code Playgroud)

解释:

  • 首先我们计算以秒为单位的绝对差并将其放入变量中
  • 然后我们检查是否获得了其中的一个或多个(日小时分钟),如果是,我们计算获得的数量并将其放入变量中
  • 对于最大之后的单位,我们执行相同的操作,但首先我们从总差中减去分配给前一个单位的秒数
  • 最后我们把剩下的作为最小单位,秒