【问题标题】:MySQL average number of hours between created datetimes for a specific time intervalMySQL 在特定时间间隔内创建日期时间之间的平均小时数
【发布时间】:2013-07-22 02:42:50
【问题描述】:

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

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

现在假设我查询所有记录 WHERE 在 DATE_SUB(NOW(), INTERVAL 4 DAYS) AND 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

我想将我使用的时间间隔(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 (NOW())

现在我想要一个查询,它会给我这 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. 其他用户正在使用不同的服务,每次使用该服务时都会生成该创建的记录。

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

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

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

【问题讨论】:

    标签: mysql time average between datetime-select


    【解决方案1】:

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

    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)。

    【讨论】:

    • 嘿 Gordon,我尝试使用您的公式,但无法获得预期的结果 (20)。我做了 SELECT (UNIX_TIMESTAMP(MAX(DATE("2013-07-21 08:00:00")+1))) 导致 1374469200,然后我做了 SELECT (UNIX_TIMESTAMP(MIN(DATE("2013-07-18 08:00:00")))) 结果为 1374123600。我按照指示减去了这两个结果,因此 1374469200 - 1374123600 为您提供 345600 毫秒或 345.6 秒。现在除以 6 得到 57.6 秒或 0.016 小时。为什么我不能用你的公式得到 20,我做错了什么?
    【解决方案2】:

    我终于弄清楚是什么导致了我的困惑。我使用了一个类似于 Gordon 建议的公式并得到 19.2,但我的计算结果为 20,所以我认为该公式不起作用,但我只是做错了数学。

    我的六个日期之间只有五个间隔,所以它是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多