【问题标题】:MySQL SUM of big TIMEDIFF大TIMEDIFF的MySQL SUM
【发布时间】:2018-08-24 10:50:13
【问题描述】:

我有一个 SQL 表活动,其中包含两个字段:started_at、end_at,每个字段是一个 Datetime 列和一个 plane_id 字段。

我们将区间“end_at - started_at”称为持续时间。

我的目标是,对于每个planet_id,获取特定时期内每个活动的间隔总和。

基本上是这样的

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(ended_at, started_at))))
FROM activity
WHERE started_at > :started_at
AND ended_at < :ended_at
GROUP BY airplane_id

问题是我的处理时间可能超过了最大时间大小(大约 838 小时),我正在寻找一种有效的解决方法。

在放弃并只提取原始数据并在 PHP 中处理它们之前,我希望一些 SQL 天才可以拯救我。

最好的问候,

【问题讨论】:

    标签: mysql sql time


    【解决方案1】:

    如何将结果表示为小数小时或天,而不是时间?

    SELECT SUM(TIME_TO_SEC(TIMEDIFF(ended_at, started_at))) / (60 * 60) as fractional_hours
    

    或者:

    SELECT SUM(TIME_TO_SEC(TIMEDIFF(ended_at, started_at))) / (24 * 60 * 60) as fractional_hours
    

    就我个人而言,我认为在如此长的时间间隔内使用时间格式没有多大价值。

    【讨论】:

    • 我考虑过使用日期格式,但我需要至少以分钟为单位获得精度,而 Datediff 只给我几天。如果你有更好的建议,我很开放:)
    • @Mouke 。 . .我不明白评论。这个答案产生十进制小时和天。
    • Decimal 的问题是人类不可读。你不能轻易说出多少分钟等于一小时的 0.42。所以基本上在那之后它需要一个 PHP 格式,我的老板想避免这种情况。
    • @Mouke 。 . .这似乎是一个奇怪的问题,有些时间框架以月为单位,而有人担心分钟。
    【解决方案2】:

    你为什么不用timestampdiff()

    SELECT sum(timestampdiff(SECOND, ended_at, started_at))
           FROM activity
    ...
    

    这会返回一个integer,因此您不必处理time 的限制(当然是integer 的限制。)而且您不需要将转换为秒,因为您已经可以在几秒钟内得到结果。

    【讨论】:

    • 整个想法是在不使用 PHP 的情况下从 SQL 获取可用数据(很明显,PHP 会获取已格式化数据的数组),以便将它们导出到 CSV 文件中。所以基本上,重点是为最终用户提供“可读”数据,因此是 HH:MM 格式。
    【解决方案3】:

    谢谢大家的回答。

    正如我所想,没有办法用纯 SQL 做我的事情,它需要一些 PHP 处理。

    所以,我会进行大规模的 PHP 治疗。

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-23
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多