我的下表有一个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格式的平均时间。
答案 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;