【问题标题】:Average difference between two dates, grouped by a third field?两个日期之间的平均差异,按第三个字段分组?
【发布时间】:2013-02-15 13:24:45
【问题描述】:

假设我们有 3 个字段,username, start_date, end_date

用户启动和停止多条记录,例如下面的 bob 已经启动和停止了两条记录。

bob   1/2/13 11:00  1/2/13 13:00
jack  1/2/13 15:00  1/2/13 18:00
bob   2/2/13 14:00  1/2/13 19:00

我需要知道每个用户(即按用户分组,而不仅仅是每一行)的平均时间(即开始和结束之间的差异),以小时为单位。

我不明白如何进行差异、平均和分组?有什么帮助吗?

【问题讨论】:

    标签: sql


    【解决方案1】:

    您没有为差异指定所需的粒度。这在几天内完成:

    select username, avg(end_date - start_date) as avg_days
    from mytable
    group by username
    

    如果您想要以秒为单位的差异,请使用datediff()

    select username, avg(datediff(ss, start_date, end_date)) as avg_seconds
    ...
    

    datediff 可以通过改变第一个参数(可以是 ss、mi、hh、dd、wk、mm 或 yy)来测量任何时间单位(最长为年)的差异。

    【讨论】:

    • 哇,好吧,比我想象的要简单。猜猜我在脑子里让它变得比它需要的更复杂。
    • 您在这里使用的是哪个版本的 PostgreSQL?你介意为这个 sn-p 创建一个 SQLFiddle 吗? @NickFoote,我怀疑这是否适用于最新版本的 PostgreSQL。
    • psql 没有datediff() 函数。 @vyegorov,你为什么要从问题中删除postgresql 标签?
    • 嗯。我得到算术溢出异常。 (使用datediff的'ss'选项)
    • @TheHitchenator AFAIK where 子句中的非索引条件 after 结果行被创建,因此根据优化器的选择,甚至计算可能涉及空日期尽管您正在将它们从最终结果中过滤掉。
    【解决方案2】:
    SELECT [username], AVG(TIMESTAMPDIFF(HOUR, start_date, end_date))
    FROM [table]
    GROUP BY [username]
    

    【讨论】:

    • 感谢您的帮助,非常快。不幸的是,我无法勾选两个答案。
    猜你喜欢
    • 2019-01-04
    • 2015-11-22
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2013-06-11
    相关资源
    最近更新 更多