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
有几种方法可以解决这个问题:
在执行日期操作之前使用 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。
如果您不想使用 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'));
我需要计算两个日期之间的秒数差异。我不能使用 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
有几种方法可以解决这个问题:
在执行日期操作之前使用 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。
如果您不想使用 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'));