MySQL为表中的特定id选择两个时间戳列之间的平均时间差

时间:2014-02-10 07:37:30

标签: php mysql sql time average

我有一张表visits,如下所示:

+--------------+-------------+------+-----+---------------------+----------------+
| Field        | Type        | Null | Key | Default             | Extra          |
+--------------+-------------+------+-----+---------------------+----------------+
| id           | int(11)     | NO   | PRI | NULL                | auto_increment |
| vis_id       | int(11)     | NO   | MUL | NULL                |                |
| unit         | int(11)     | NO   | MUL | NULL                |                |
| time_in      | timestamp   | NO   | MUL | CURRENT_TIMESTAMP   |                |
| time_out     | timestamp   | NO   | MUL | 0000-00-00 00:00:00 |                |
| in_username  | varchar(16) | NO   | MUL | NULL                |                |
| out_username | varchar(16) | NO   | MUL | NULL                |                |
+--------------+-------------+------+-----+---------------------+----------------+

我用它来跟踪进出我建筑物的访客。

我想要的是能够以特定访问者(由vis_id定义)以小时为单位查看“平均访问时长”。如果平均访问时长小于一小时,则应该最多为1。

以下是我想要输出的示例:

+--------+------+----------+
| vis_id | unit | avg_time |
+--------+------+----------+
|    156 |  216 | 5        |
|   1230 |  103 | 2        |
|    533 |  112 | 1        |  
|    802 |  201 | 3        |
|   1445 |  431 | 4        |
+--------+------+----------+

建议?

1 个答案:

答案 0 :(得分:2)

使用AVG()分组功能。据我所知,你需要两个分组字段,如下所示:

SELECT 
  vis_id,
  unit,
  ROUND(AVG((UNIX_TIMESTAMP(time_out)-UNIX_TIMESTAMP(time_in))/3600)) AS avg_time
FROM
  visits
GROUP BY
  vis_id,
  unit

注意,我正在使用ROUND(),因为您没有定义处理非整数值的规则。 ROUND()将使用代数规则,但您可能希望删除非整数部分。然后查看FLOOR() - 或者,添加整数部分(即舍入到最大) - 然后查看CEIL()