【发布时间】:2011-04-01 11:45:25
【问题描述】:
有没有一种方法可以在 MySQL 中进行查询,以秒为单位提供两个时间戳之间的差异,或者我需要在 PHP 中执行此操作吗?如果是这样,我该怎么做?
【问题讨论】:
有没有一种方法可以在 MySQL 中进行查询,以秒为单位提供两个时间戳之间的差异,或者我需要在 PHP 中执行此操作吗?如果是这样,我该怎么做?
【问题讨论】:
您可以使用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)
您还可以在其他答案中使用UNIX_TIMESTAMP() 函数作为@Amber suggested:
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 )。引用docs:
当
UNIX_TIMESTAMP()用于TIMESTAMP列时,函数直接返回内部时间戳值,没有隐式的“字符串到Unix 时间戳”转换。请记住
TIMEDIFF()return data type ofTIME。TIME值的范围可能从“-838:59:59”到“838:59:59”(大约 34.96 天)
【讨论】:
unit 参数设置为SECOND。
“TIMESTAMPDIFF”怎么样:
SELECT TIMESTAMPDIFF(SECOND,'2009-05-18','2009-07-29') from `post_statistics`
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff
【讨论】:
str_to_date(date_column, '%m/%d/%Y')。
TIME_TO_SEC 在3020399 处达到最大值,而这会返回正确的值。
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)
如果您需要无符号差异,请在表达式周围添加 ABS()。
或者,您可以使用TIMEDIFF(ts1, ts2),然后使用TIME_TO_SEC() 将时间结果转换为秒。
【讨论】:
请注意,TIMEDIFF() 解决方案仅在 datetimes 相隔小于 35 天 时有效!
TIMEDIFF() 返回 TIME 数据类型,TIME 的最大值为 838:59:59 小时(=34.96 天)
【讨论】: