为什么 mysql timediff 函数输出错误?
why does mysql timediff function give wrong output?
当我使用 timediff 函数时,mysql 没有给出预期的输出。 mysql的版本是5.5
SELECT TIME_FORMAT(TIMEDIFF( '2018-06-18 08:20:00','2019-01-25 14:29:00'),'%H:%i:%s');
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 and SQLFiddle2.
预期结果是:总时分秒,这就是你想要的:
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
TIMEDIFF 和 TIME 有限制。
当两个 TIMESTAMP 之间的差异变大时,这会产生问题。
但是如果计算 TIMESTAMP 的 TIME 部分之间的 TIMEDIFF,那就没问题了。不管怎样,分秒必争。
可以通过 TIMESTAMPDIFF 计算 2 个时间戳之间的小时差。
因此下面的查询将时差 (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;
Returns
tm
-------------
5310:09:10
-5310:09:10
对 db<>fiddle here
的测试
mysql 没有给出预期的输出。 mysql的版本是5.5
SELECT TIME_FORMAT(TIMEDIFF( '2018-06-18 08:20:00','2019-01-25 14:29:00'),'%H:%i:%s');
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 and SQLFiddle2.
预期结果是:总时分秒,这就是你想要的:
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
TIMEDIFF 和 TIME 有限制。
当两个 TIMESTAMP 之间的差异变大时,这会产生问题。
但是如果计算 TIMESTAMP 的 TIME 部分之间的 TIMEDIFF,那就没问题了。不管怎样,分秒必争。
可以通过 TIMESTAMPDIFF 计算 2 个时间戳之间的小时差。
因此下面的查询将时差 (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;
Returns
tm
-------------
5310:09:10
-5310:09:10
对 db<>fiddle here
的测试