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


97

有没有一种方法可以在MySQL中进行查询,以秒为单位提供两个时间戳之间的差异,还是需要在PHP中进行?如果是这样,我将如何去做?

Answers:


176

您可以使用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)

您还可以使用其他答案中建议的@AmberUNIX_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值已经存储为整数,表示自纪元(Source)以来的秒数。引用文档

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

请注意,TIMEDIFF() 返回数据类型为TIMETIME值的范围可以从“ -838:59:59”到“ 838:59:59”(大约34.96天)


11
您也可以使用TIMESTAMPDIFF,它可以在单个函数中执行-只需将unit参数设置为即可SECOND
Mike 2010年

+1为性能说明。我没有使用UNIX_TIMESTAMP(),因为我认为这将花费更多时间。
elcool 2011年

51

“ TIMESTAMPDIFF”如何:

SELECT TIMESTAMPDIFF(SECOND,'2009-05-18','2009-07-29') from `post_statistics`

https://dev.mysql.com/doc/refman/5.7/zh-CN/date-and-time-functions.html#function_timestampdiff


如果您的日期列采用YYYY-MM-DD以外的其他格式,请尝试执行以下操作:str_to_date(date_column, '%m/%d/%Y')在TIMESTAMPDIFF函数中,需要更正其格式的列。
国王

这对我来说是一个更好的答案,因为TIME_TO_SEC最大化了,3020399而这将返回正确的值。
Billynoah

21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

如果要获得无符号的差异,请ABS()在表达式周围添加一个。

或者,您可以使用TIMEDIFF(ts1, ts2),然后通过将时间结果转换为秒TIME_TO_SEC()


11

需要注意的是,TIMEDIFF()当溶液只能datetimes小于35天分开! TIMEDIFF()返回TIME数据类型,并且TIME最大值为838:59:59小时(= 34,96天)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.