如何在MySQL中的日期之间取平均值? 我对时间值,小时和分钟更感兴趣。
在表格上:
| date_one | datetime |
| date_two | datetime |
执行以下查询:
SELECT AVG(date_one-date_two) FROM some_table WHERE some-restriction-applies;
AVG(date1-date2)
有效,但我不知道它返回的是什么数据。
答案 0 :(得分:24)
这似乎有点hackish,但将适用于日期〜1970年和2030年(32位拱门)。实质上,您将日期时间值转换为整数,对它们求平均值,并将平均值转换回日期时间值。
SELECT
from_unixtime(
avg(
unix_timestamp(date_one)-unix_timestamp(date_two)
)
)
FROM
some_table
WHERE
some-restriction-applies
可能有一个更好的解决方案,但这会让你陷入困境。
答案 1 :(得分:8)
select avg(datediff(date1,date2))
select avg(timediff(datetime,datetime))
答案 2 :(得分:2)
SELECT date_one + (date_two - date_one) / 2 AS average_date
FROM thetable
WHERE whatever
您无法对日期进行求和,但您可以减去它们并获得可以减半并添加回第一个日期的时间间隔。
答案 3 :(得分:2)
SELECT TIMESTAMPADD(MINUTE, TIMESTAMPDIFF(MINUTE, '2011-02-12 10:00:00', '2011-02-12 12:00:00')/2, '2011-02-12 10:00:00')
结果是 '2011-02-12 11:00:00'
答案 4 :(得分:1)
想出你可以在一段时间内在几分钟内完成一次约会,平均然后将这些时间加回到设定的时间......
答案 5 :(得分:1)
CREATE TABLE `some_table`
(
`some_table_key` INT(11) NOT NULL AUTO_INCREMENT,
`group_name` VARCHAR(128) NOT NULL,
`start` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`finish` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`some_table_key`)
);
SELECT
group_name,
COUNT(*) AS entries,
SEC_TO_TIME( AVG( TIME_TO_SEC( TIMEDIFF(finish, start) ) ) ) AS average_time
FROM some_table
GROUP BY
some_table.group_name
;
在使用组函数时,您应该始终指定所需的组,如果稍后使用JOIN等扩展查询并假设MySql将为您选择正确的组,则可以使用组函数结束一些讨厌的混乱。
答案 6 :(得分:0)
AVG是一个分组函数,这意味着它将对表中的所有行求和并除以行数。但听起来你想要两个不同列的平均值,每行单独报告。在这种情况下,您应该自己计算:(date1 + date2)/ 2。 (MySQL可能需要一些额外的语法来正确添加这些列。)
您编写的代码将为您提供表格在date1和date2之间的平均已过去时间。