为什么mysql timediff函数给出错误的输出?

时间:2019-01-25 09:43:26

标签: mysql sql database mysql-5.5

当我使用timediff函数时,mysql没有给出预期的输出。 mysql的版本是5.5

pip

3 个答案:

答案 0 :(得分:1)

TIMEDIFF不能超过839小时,因此,您无法测量超过35天以上的较长时间的差异。在这种情况下,您可以执行以下操作:

  • 使用TIMESTAMPDIFF来获取秒数
  • 将秒转换为hh:m:ss

例如

SET @seconds := (SELECT TIMESTAMPDIFF(second, '2018-06-18 08:20:00','2019-01-25 14:29:00'));
SELECT CONCAT(FLOOR(@seconds/3600),':',FLOOR((@seconds%3600)/60),':',(@seconds%3600)%60) AS difference;

如果您要在同一个查询中同时执行这两个操作,则可以使用以下命令:

SELECT CONCAT(FLOOR(TIMESTAMPDIFF(second, '2018-06-18 08:20:00','2019-01-25 14:29:00')/3600),
':',FLOOR((TIMESTAMPDIFF(second, '2018-06-18 08:20:00','2019-01-25 14:29:00')%3600)/60),
':',(TIMESTAMPDIFF(second, '2018-06-18 08:20:00','2019-01-25 14:29:00')%3600)%60) 
AS difference;

这里是 SQLFiddle1 SQLFiddle2

答案 1 :(得分:1)

TIMEDIFF和TIME有限制。
当两个TIMESTAMP之间的差异变大时,这会带来问题。

但是,如果人们计算出TIMESTAMP的TIME部分之间的TIMEDIFF,那很好。无论如何,分钟和秒。

可以通过TIMESTAMPDIFF计算两个时间戳之间的小时差。

因此,下面的查询将时差(f.e.'5310')替换为有用的时差(f.e.':09:10')

示例片段:

SELECT 
CONCAT(TIMESTAMPDIFF(HOUR, ts1, ts2), RIGHT(TIMEDIFF(CAST(ts1 AS TIME), CAST(ts2 AS TIME)), 6)) as tm
FROM (
  SELECT TIMESTAMP('2018-06-18 08:20:00') ts1, TIMESTAMP('2019-01-25 14:29:10') ts2
  union all
  SELECT TIMESTAMP('2019-01-25 14:29:10') ts1, TIMESTAMP('2018-06-18 08:20:00') ts2
) q;

返回

tm
-------------
5310:09:10 
-5310:09:10 

db <>小提琴here

的测试

答案 2 :(得分:0)

预期结果是:总时分分钟秒,这就是您想要的:

SELECT 
CONCAT(
    TIMESTAMPDIFF(HOUR, '2018-06-18 08:20:00', '2019-01-25 14:29:00'), ":", 
    TIMESTAMPDIFF(minute, '2018-06-18 08:20:00', '2019-01-25 14:29:00'), ":",
    TIMESTAMPDIFF(SECOND, '2018-06-18 08:20:00', '2019-01-25 14:29:00'));

这将导致:

5310:318609:19116540