MySQL-秒差意外结果

时间:2018-07-10 07:49:49

标签: mysql sql mysql-8.0

我需要计算两个日期之间以秒为单位的差异。由于其limitations,我无法使用TIMEDIFF。

当我使用时:

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

它返回预期的86400秒(24小时显示),但是当我使用时:

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

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

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

2 个答案:

答案 0 :(得分:3)

看来2015年3月29日的夏令时改变了,这可能是原因 Daylight saving 2015

答案 1 :(得分:1)

有两种方法可以解决此问题:

使用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');

这将返回172800,即适当的时差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.