如何以秒为单位获取两个时间戳之间的差异

134

我能否在MySQL中查询两个时间戳之间的秒数差异,还是需要在PHP中进行处理?如果需要,在PHP中应该如何处理呢?

4个回答

226

你可以使用TIMEDIFF()TIME_TO_SEC()函数来实现:

SELECT TIME_TO_SEC(TIMEDIFF('2010-08-20 12:01:00', '2010-08-20 12:00:00')) diff;
+------+
| diff |
+------+
|   60 |
+------+
1 row in set (0.00 sec)

你还可以像@Amber在另一个回答中建议的那样,使用UNIX_TIMESTAMP()函数:

SELECT UNIX_TIMESTAMP('2010-08-20 12:01:00') - 
       UNIX_TIMESTAMP('2010-08-20 12:00:00') diff;
+------+
| diff |
+------+
|   60 |
+------+
1 row in set (0.00 sec)
如果您在使用TIMESTAMP数据类型,我认为UNIX_TIMESTAMP()解决方案可能会稍微快一些,因为TIMESTAMP值已经存储为表示自纪元以来的秒数的整数(来源)。引用文档:

UNIX_TIMESTAMP()用于TIMESTAMP列时,该函数直接返回内部时间戳值,没有隐含的“字符串到Unix时间戳”的转换。

请记住,TIMEDIFF()返回TIME数据类型TIME值可以范围从 '-838:59:59' 到 '838:59:59' (大约34.96天)


16
你也可以使用TIMESTAMPDIFF函数,在一个函数中完成操作 - 只需将unit参数设置为SECOND即可。 - Mike

76

如果您的日期列不是YYYY-MM-DD格式,请尝试在需要格式更正的列的TIMESTAMPDIFF函数中执行以下操作:str_to_date(date_column, '%m/%d/%Y') - greaterKing
1
对我来说这是更好的答案,因为 TIME_TO_SEC 最大值为 3020399,而这个函数可以返回正确的值。 - But those new buttons though..
1
请注意,MySQL是将第二个日期从第一个日期中减去,而不是相反。唉。 - Felipe Zavan
我不喜欢这种方法,因为它没有四舍五入。我更喜欢:TIMESTAMPDIFF( SECOND, start_date, end_date ) / 3600.0 - Antonio Andrés
@AntonioAndrés 嗯...这也不是四舍五入。例如,“timestampdiff(second, '2009-05-18 07:28:17','2009-07-29 14:23:45') / 3600.0” 的结果为1734.9244。 - Dennis

24
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

如果你想得到无符号差异,可以在表达式周围添加ABS()

另外,你也可以使用 TIMEDIFF(ts1, ts2) 然后用 TIME_TO_SEC()将时间结果转换为秒。


18
请注意,TIMEDIFF()方法仅适用于两个datetimes时间间隔小于35天的情况! TIMEDIFF()返回TIME数据类型,而TIME数据类型的最大值为838:59:59小时(即34.96天)

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