Mysql - 秒差意外结果

Mysql - seconds difference unexpected result

我需要计算两个日期之间的秒数差异。我不能使用 TIMEDIFF 因为它 limitations.

当我使用时:

SELECT UNIX_TIMESTAMP('2015-03-28 08:21:15') - UNIX_TIMESTAMP('2015-03-27 08:21:15');

它 returns 预计 86400 秒(什么是 24 小时)但是当我使用时:

SELECT UNIX_TIMESTAMP('2015-03-29 08:21:15') - UNIX_TIMESTAMP('2015-03-27 08:21:15');

它似乎没有给出 86400*2,而是给出了 169200 而给出了 47 小时。

问题是 - 为什么会这样?这是错误还是功能?有没有其他合理的方法来计算时差而不用担心时间限制?

看来 2015 年的 3 月 29 日有日光变化,这可能是原因 Daylight saving 2015

有几种方法可以解决这个问题:

UNIX_TIMESTAMP()

在执行日期操作之前使用 SET SESSION time_zone = '+0:00'

SET SESSION time_zone = '+0:00';
SELECT UNIX_TIMESTAMP('2015-03-29 08:21:15') - UNIX_TIMESTAMP('2015-03-27 08:21:15');

这个returns172800,即48 hours的本征时差。
Demo


TIMESTAMPDIFF()

如果您不想使用 SET SESSION time_zone,您可以尝试 TIMESTAMPDIFF()

SELECT UNIX_TIMESTAMP('2015-03-29 08:21:15') - UNIX_TIMESTAMP('2015-03-27 08:21:15');
SELECT TIMESTAMPDIFF(SECOND, '2015-03-27 08:21:15', '2015-03-29 08:21:15');

第一次计算结果为 169200(即 47 hours),第二次计算结果为 172800(即 48 hours)。

请记住,较小的时间戳应该首先在 TIMESTAMPDIFF() 中使用,否则您会得到否定的结果。或者,您可以将 TIMESTAMPDIFF() 包装在 ABS() 下:

SELECT ABS(TIMESTAMPDIFF(SECOND, '2015-03-29 08:21:15', '2015-03-27 08:21:15'));

Rextester link.