我需要计算两个日期之间以秒为单位的差异。由于其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小时。
问题是-为什么?它是错误还是功能?还有其他合理的方式来计算时差而不用担心时间限制吗?
答案 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'));