MySQL: 两个时间戳之间的秒数差异是多少?

51
可以在MySQL中计算两个时间戳之间的差异,并以秒为单位输出结果吗?
例如,2010-11-29 13:16:55 - 2010-11-29 13:13:55应该得到180秒。
谢谢。

一天前有一个非常类似的问题被问到了:https://dev59.com/ilLTa4cB1Zd3GeqPYTVc - Orbling
1
@Orbling:不,结果非常不同,因为输出是以hh:mm:ss的格式。 - OMG Ponies
@OMG,我对那个问题的回答,也就是被采纳的答案,是以hh:mm:ss的格式呈现的——其他答案没有这样做,因此它包括了他的回答。你下面所重述的内容也是如此。 - Orbling
3个回答

164

我认为被接受的答案并不是一个好的通用解决方案!

这是因为UNIX_TIMESTAMP()函数在1970-01-01之前的DATE上失败(并且对于使用32位整数的将来日期也会失败)。这很容易发生在许多活着的人的出生日期。

更好的解决方案是:

SELECT TIMESTAMPDIFF(SECOND, '2010-11-29 13:13:55', '2010-11-29 13:16:55')

可以修改它以返回DAY YEAR MONTH HOUR和MINUTE!


有没有办法将结果转换为时:分:秒格式? - coolDude
这段代码运行完美。然而,答案是反过来的(第二个日期减去第一个日期)才是答案。TIMESTAMPDIFF(YEAR, '2016-01-01 00:00:00', '2015-01-01 00:00:00') 返回的是 -1 而不是 1。谢谢。 - Kareem
3
@Kareem:OP希望结果为180,这正是我的示例代码给出的结果。 - OderWat
4
@coolDude:使用SELECT SEC_TO_TIME(TIMESTAMPDIFF(SECOND, '2010-11-29 13:13:55','2010-11-29 13:16:55'))可以解决问题。 - OderWat
@OderWat 感谢您的回复,我很久以前就解决了这个问题。选择 SEC_TO_TIME(TIMESTAMPDIFF(SECOND, StartTime, EndTime)) 作为执行时间从 abc 进行查询。 - coolDude
@OderWat,你的例子很完美,我只是想向其他人澄清一下,因为我尝试了几次才弄明白。谢谢。 - Kareem

42

使用UNIX_TIMESTAMP函数将DATETIME转换为从1970年1月1日开始的秒值:

SELECT UNIX_TIMESTAMP('2010-11-29 13:16:55') - UNIX_TIMESTAMP('2010-11-29 13:13:55') as output

结果:

output
-------
180

如果您不确定哪个值更大,则可以使用ABS函数轻松处理:

SELECT ABS(UNIX_TIMESTAMP(t.datetime_col1) - UNIX_TIMESTAMP(t.datetime_col2)) as output

7
此功能不支持1970年1月1日之前的日期。 - Rid Iculous
1
谢谢,詹姆斯。我会把这个和其他的一起使用。我年纪大了,所以对我来说能在几秒钟内得到我的生日很重要。:oP - Rid Iculous

2

TIMESTAMPDIFF 方法只适用于日期时间格式。如果您想计算两个时间之间的差值,例如 '11:10:00' 减去 '10:20:00',则请使用

select TIME_TO_SEC('11:10:00')-TIME_TO_SEC('10:20:00')

TIMESTAMPDIFF 可用于 'time' 数据类型。 选择 TIMESTAMPDIFF(MINUTE,cast('08:22:03' as time),cast('09:59:03' as time))。 - MikA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接