我需要两个日期之间的天数、小时数和分钟数的差值。当前日期 (NOW()) 和结束日期。我在两个不同的查询中需要它们,它们的工作方式略有不同。
第一个需要以下列格式将它们作为单列返回:
-------------------------
| time_left |
-------------------------
| x days x hours x min |
-------------------------
第二个需要在三个单独的列中返回它们,如果 end_date 已经超过当前日期,请确保它为每一列返回 0:
-------------------------------------------
| days_left | hrs_left | min_left |
-------------------------------------------
| x | x | x |
-------------------------------------------
我有一个解决所有这些问题的方法,但它太糟糕了。我敢肯定有人至少找到了一种相对干净的方法来解决这个问题。先谢谢了!
最佳答案
之前的那个是不准确的,显示了一天和 3 小时的差异,应该是一个小时。
这个在任何时候都应该是准确的
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;
解释:
- 首先我们计算绝对差值(以秒为单位)并将其放入变量
- 然后我们检查我们是否获得了每个(天小时分钟)中的一个或多个,如果是,我们计算我们获得了多少并将其放入一个变量中
- 对于最大之后的单位,我们做同样的事情,但首先我们从整体差异中减去分配给前一个单位的秒数
- 最后我们把剩下的作为最小单位,秒
关于MySQL datetime 以天、小时和分钟为单位的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23567111/