代码之家  ›  专栏  ›  技术社区  ›  fmsf

我如何才能在MySQL中对日期进行平均?

  •  21
  • fmsf  · 技术社区  · 15 年前

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

    在桌子上:

    | date_one   | datetime |
    | date_two   | datetime |
    

    执行如下查询:

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

    编辑:

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

    7 回复  |  直到 11 年前
        1
  •  24
  •   fmsf    15 年前

    这似乎有点老土,但适用于1970年至2030年(32位拱门)。您实际上是将日期时间值转换为整数,求其平均值,然后将平均值转换回日期时间值。

    SELECT
        from_unixtime(
            avg(
                unix_timestamp(date_one)-unix_timestamp(date_two)
            )
        )
    FROM
        some_table
    WHERE
        some-restriction-applies
    

    有可能有更好的解决方案,但这将使你在紧要关头度过难关。

        2
  •  8
  •   Jérôme Verstrynge Mark    13 年前
    select avg(datediff(date1,date2))
    select avg(timediff(datetime,datetime))
    
        3
  •  2
  •   Alex Martelli    15 年前
    SELECT date_one + (date_two - date_one) / 2 AS average_date
    FROM thetable
    WHERE whatever
    

    你不能求和日期,但是你可以减去它们,得到一个时间间隔,你可以减半,然后加回到第一个日期。

        4
  •  2
  •   Jérôme Verstrynge Mark    13 年前
    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'

        5
  •  1
  •   ChickenMilkBomb    15 年前

    想想看,你可以在一个设定的时间后以分钟为单位做一个datediff,取其平均值,然后把这些分钟加回到设定的时间中……

        6
  •  1
  •   Martin    11 年前
    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
    ;
    

    在使用group函数时,您应该始终指定所需的组,如果以后使用join等扩展查询,并假定mysql将为您选择正确的组,则可能会导致与group函数发生一些严重的混乱。

        7
  •  0
  •   Paul A Jungwirth Mathew Sachin    15 年前

    avg是一个分组函数,这意味着它将对表中的所有行求和并除以行计数。但听起来您需要两个不同列的平均值,每行单独报告。在这种情况下,您应该自己计算:(date1+date2)/2。(MySQL可能需要一些额外的语法来正确地添加这些列。)

    你写的代码会给你表的平均值。 逝去 日期1和日期2之间的时间。