如何在MySQL中平均化日期?

时间:2009-06-20 16:22:06

标签: sql mysql

如何在MySQL中的日期之间取平均值? 我对时间值,小时和分钟更感兴趣。

在表格上:

| date_one   | datetime |
| date_two   | datetime |

执行以下查询:

 SELECT AVG(date_one-date_two) FROM some_table WHERE some-restriction-applies;

编辑:

AVG(date1-date2)有效,但我不知道它返回的是什么数据。

7 个答案:

答案 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之间的平均已过去时间。