MySQL:获取平均时差?

Posted

技术标签:

【中文标题】MySQL:获取平均时差?【英文标题】:MySQL: Get average of time differences? 【发布时间】:2011-02-12 21:54:59 【问题描述】:

我有一个名为 Sessions 的表,其中包含两个日期时间列:开始和结束。

对于每一天 (YYYY-MM-DD),可以有许多不同的开始和结束时间 (HH:ii:ss)。我需要找到这些开始时间和结束时间之间所有差异的每日平均值。

几行的例子是:

start: 2010-04-10 12:30:00 end: 2010-04-10 12:30:50
start: 2010-04-10 13:20:00 end: 2010-04-10 13:21:00
start: 2010-04-10 14:10:00 end: 2010-04-10 14:15:00
start: 2010-04-10 15:45:00 end: 2010-04-10 15:45:05
start: 2010-05-10 09:12:00 end: 2010-05-10 09:13:12
...

2010-04-10 的时间差(以秒为单位)为:

50
60
300
5

2010-04-10 的平均值为 103.75 秒。我希望我的查询返回如下内容:

day: 2010-04-10 ave: 103.75
day: 2010-05-10 ave: 72
...

我可以获取按开始日期分组的时差,但我不确定如何获取平均值。我尝试使用 AVG 函数,但我认为它只能直接作用于列值(而不是另一个聚合函数的结果)。

这就是我所拥有的:

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

有没有办法获得每个开始日期组的 timediff 平均值?我是聚合函数的新手,所以也许我误解了一些东西。如果您知道其他解决方案,请分享。

我总是可以临时做它并在 php 中手动计算平均值,但我想知道是否有一种方法可以在 mysql 中做到这一点,这样我就可以避免运行一堆循环。

谢谢。

【问题讨论】:

【参考方案1】:
SELECT  DATE(start) AS startdate, AVG(TIME_TO_SEC(TIMEDIFF(end,start))) AS timediff
FROM    Sessions
GROUP BY
        startdate

【讨论】:

是的,就是这样,我一发布问题就意识到了。我觉得有点傻。我无法让它工作的原因是我在做 AVG(timediff),我猜你需要直接传递表达式并且不能使用别名。谢谢。【参考方案2】:
SELECT  DATE(start) AS startdate, SEC_TO_TIME(AVG(TIME_TO_SEC(TIMEDIFF((end,start))))) AS avgtimediff
FROM    Sessions
GROUP BY DATE(start)

这将给出上一个答案给出数字的时间平均值。

【讨论】:

它在上午 12:00 给出答案。如何进一步解决?

以上是关于MySQL:获取平均时差?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 获取两个 DateTime 对象之间的时差?

MySQL:获取计数和平均值 [重复]

如何获取两个日期时间字段的轨道分钟时差?

MySQL:获取对应于某个 ID 的值的平均值

如何在PHP中以分钟为单位获取时差

mysql 获取单个科目的平均分