日期时间列的平均值

时间:2014-12-09 15:22:22

标签: php mysql date datetime

我的下表有一个datetime列:

id | datetime 
1  | 2014-12-01 20:00:00
2  | 2014-12-03 12:04:00
3  | 2014-12-04 10:15:00
4  | 2014-12-05 13:45:00
.. | ...etc

首先,我只选择小时&日期时间字段的分钟,但我不知道如何选择时间字段的平均值:

SELECT TIME_FORMAT(datetime, '%H:%i') as time FROM table_x;

最终结果应为HH:SS格式的平均时间。

3 个答案:

答案 0 :(得分:2)

您可以使用如下表达式获得平均值:

select avg(time_to_sec(time(datetime)))

回到过去:

select sec_to_time(avg(time_to_sec(time(datetime))))

然后你可以随意格式化。

答案 1 :(得分:2)

你问的是没有意义的。这就是原因。

平均值,就算术平均而言,是通过将值之和除以值的数量来计算的。 '2014-01-01 08:00 am'和'2014-01-01 09:00 am'的总和是多少?这字面意思无意义;你不能在早上9点到早上8点添加。

中值和模式都可以作为DateTime类型值集中趋势的度量。但平均值不是。

具有更好类型支持的其他平台使其更清晰。以PostgreSQL为例。

sandbox=# create table test (ts timestamp with time zone);
CREATE TABLE
sandbox=# insert into test values ('2014-01-01 08:00');
INSERT 0 1
sandbox=# insert into test values ('2014-01-01 09:00');
INSERT 0 1
sandbox=# select avg(ts) from test;
ERROR:  function avg(timestamp with time zone) does not exist
LINE 1: select avg(ts) from test;
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
sandbox=# select sum(ts) from test;
ERROR:  function sum(timestamp with time zone) does not exist
LINE 1: select sum(ts) from test;
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

通常,使用MySQL的人试图使用DateTime数据类型表达时间间隔。这可能会令人困惑,因为时间间隔和时间点都使用类似的表示法。例如,如果将其解释为间隔,则值'08:00'可能表示“八小时”。如果你把它解释为一个时间点,它可能意味着“早上八点”。

MySQL支持时间点数据类型。它支持SQL间隔。但是PostgreSQL确实如此,这就是它的不同之处。

sandbox=# create table test (duration interval);
CREATE TABLE
sandbox=# insert into test values ('15 hours');
INSERT 0 1
sandbox=# insert into test values ('16 hours');
INSERT 0 1
sandbox=# select sum(duration) from test;
   sum
----------
 31:00:00
(1 row)

sandbox=# select avg(duration) from test;
   avg
----------
 15:30:00
(1 row)

区别:虽然添加或平均8点和9点没有意义,但 有意义添加并平均8小时9小时。

如果要在MySQL中存储类似 SQL间隔的内容,请将它们存储为整数,意味着分钟或秒(或其他),并对整数进行算术运算。

答案 2 :(得分:0)

如果您只想要平均日期:

SELECT CAST(AVG(CAST(datefield AS INT)) AS DATETIME) FROM dates;

如果你还想要时间:

SELECT CAST(AVG(CAST(datefield AS FLOAT)) AS DATETIME) FROM dates;