MySQL在特定时间间隔内创建的日期时间之间的平均小时数

时间:2013-07-22 02:42:51

标签: mysql time average between datetime-select

我有一个名为“created”的字段的表,它是一个日期时间字段。

假设NOW()在2013-07-21午夜,所以NOW()= 2013-07-21 23:59:59

现在让我说我查询所有记录 WHERE创建了BETWEEN DATE_SUB(NOW(),INTERVAL 4 DAYS)和NOW()

假设返回的结果如下:

  1. 2013-07-18 08:00:00
  2. 2013-07-19 08:00:00
  3. 2013-07-20 08:00:00
  4. 2013-07-21 08:00:00
  5. 我想将我使用的间隔(4天)的开始和结束日期时间添加到该结果集中,所以现在我有:

    1. 2013-07-18 00:00:00(4天前从NOW())
    2. 2013-07-18 08:00:00
    3. 2013-07-19 08:00:00
    4. 2013-07-20 08:00:00
    5. 2013-07-21 08:00:00
    6. 2013-07-21 23:59:59(现在())
    7. 现在我想要一个查询,它会给我这6个日期时间结果之间的平均小时数。

      即(8 + 24 + 24 + 24 + 24 + 16)/ 6,平均为20小时。

      我在堆栈上发现了这个

      SELECT
      TIME_TO_SEC(TIMEDIFF(end,start)) AS timediff
      FROM
      Sessions
      GROUP BY
      DATE(start)
      

      这个查询的问题是我每次都要运行它6次(在PHP循环中),然后添加所有结果和/ 6然后/到3600.

      如何使用mySQL获得我想要的结果?

      谢谢!

      只是为了进一步澄清:

      假设两件事。

      1. 用户将选择日期范围(在本例中为7月21日至7月18日)

      2. 其他用户正在使用不同的服务,每次使用该服务时都会生成该记录。

      3. 第一个用户想知道第二个用户在所选日期范围之间平均(以小时为单位)使用该第二个服务的频率。

        所以,它需要考虑2013-07-18 00:00:00和2013-07-18 08:00:00之间的时间(那些8小时的事情),最后16小时也是如此,因为用户在这些时间段内没有使用该服务。

        基本上我不仅想要4个初始创建记录之间的平均小时数,我认为(如果我错了,请纠正我)这是戈登所建议的。

2 个答案:

答案 0 :(得分:2)

平均值是第一个和最后一个记录之间的差值除以计数加上一些数字。

SELECT (UNIX_TIMESTAMP(max(date(created)+1), min(date(created)))/1000)/(count(*)+2) AS timediffsecs
FROM Sessions
WHERE created BETWEEN DATE_SUB(NOW(), INTERVAL 4 DAYS) AND NOW()

这是做什么的?首先,它不会向数据添加其他记录。相反,它只是将较早的日期四舍五入并将更晚的日期四舍五入。 UNIX_TIMETAMP从某个时间点开始以毫秒为单位生成值。取最大和最小的区别。最后,除以遇到的行数加上2(我认为它应该是计数加1,但你的问题是计数加2)。

答案 1 :(得分:0)

我终于弄明白是什么导致了我的困惑。我使用了类似于戈登所建议的公式并得到了19.2,但我的计算结果是20,所以我认为这个公式没有用,但是我的数学错误。

我的SIX日期之间只有五个间隔,所以它是8 + 24 + 24 + 24 + 16/5,这是19.2,这是我最终使用的查询。

我希望这有助于某人。

SELECT TIMESTAMPDIFF(SECOND,DATE_SUB(NOW(), INTERVAL 4 DAY),NOW()) / (COUNT(created) - 1) / 3600 AS time_diff_hours, member_id
FROM members
WHERE created BETWEEN DATE_SUB(NOW(), INTERVAL 4 DAY) AND NOW()
GROUP BY members.id