如何在时间戳列上查找平均值

时间:2015-04-10 14:55:26

标签: mysql sql date

我需要找出事件开始的平均时间。开始时间记录在startDate列中的DB中。

|    StartDate        |
|=====================|
|2015/04/10 3:46:07 AM|
|2015/04/09 3:47:37 AM|
|2015/04/08 3:48:07 AM
|2015/04/07 3:43:44 AM|
|2015/04/06 3:39:08 AM|
|2015/04/03 3:47:50 AM|

所以我需要的是计算事件每天开始的平均时间(hh:MM:ss)。

我不太清楚如何处理这个问题。以下查询不会工作,因为它只是总结并将总值除以总数:

SELECT AVG(DATE_FORMAT(StartDate,'%r')) FROM MyTable

4 个答案:

答案 0 :(得分:3)

演示:http://sqlfiddle.com/#!9/33c09/3

说明:

select TIME_FORMAT(avg(cast(startDate as time)),'%h:%i:%s %p') as avg_start_date
from demo

设定:

create table demo (startDate datetime);

insert demo (startDate) values ('2015-04-10 3:46:07');
insert demo (startDate) values ('2015-04-09 3:47:37');
insert demo (startDate) values ('2015-04-08 3:48:07');
insert demo (startDate) values ('2015-04-07 3:43:44');
insert demo (startDate) values ('2015-04-06 3:39:08');
insert demo (startDate) values ('2015-04-03 3:47:50');

说明:

  • 施放到时间可确保忽略日期组件(如果您要平均日期时间并希望平均时间,它就像平均两位数字并希望单位匹配您的日期一样已经看过,如果你只是平均这些数字的单位)。
  • AVG是您已经熟悉的平均功能。
  • TIME_FORMAT将以用户友好的方式显示您的数据,以便您检查结果。

答案 1 :(得分:2)

首先,您必须提取日期时间格式以仅包含时间,以便可以对其使用聚合函数。这是通过将其强制转换为TIME类型来完成的。然后,您可以使用内置聚合函数AVG()来实现目标和分组,以获得表格中每天的平均开始日期。

这是由

完成的
SELECT AVG(StartDate::TIME) FROM MyTable

要获得每日平均开始时间

SELECT StartDate::DATE, AVG(StartDate::TIME) FROM MyTable GROUP BY StartDate::DATE

如果您还希望在那段时间内没有事件开始的日子,请检查here等效于generate_series,这不是MySQL中的选项。

答案 2 :(得分:0)

将其转换为毫秒应用AVG功能并返回日期

答案 3 :(得分:0)

您可以将时间戳转换为unix时间,计算平均值然后再转回时间戳格式:

>select FROM_UNIXTIME((sum(UNIX_TIMESTAMP(tstamp))/count(*))) from test
April, 07 2015 07:45:25

以下是您的数据示例:timestamp column average