【问题标题】:Mysql query to average timeMysql查询平均时间
【发布时间】:2012-07-30 19:20:42
【问题描述】:

我玩很多棋盘游戏,我维护一个网站/数据库来跟踪一些统计数据。其中一张表记录了不同的时间。它的结构是这样的:

  • gameName(文本 - 棋盘游戏的名称)
  • numPeople(int - 玩过的人数)
  • timeArrived(时间戳 - 我们到达正在玩游戏的房子的时间)
  • beginSetup(时间戳 - 我们开始设置游戏的时间)
  • startPlay(时间戳 - 我们实际开始玩游戏的时间)
  • gameEnd(时间戳 - 游戏结束的时间)

基本上,我想做的是利用这些时间从中获取一些有趣/有用的信息(比如平均什么游戏需要最长的设置时间,什么游戏平均需要最长的时间,什么游戏是从到达到完成的时间最长,等等......)通常,我过于依赖 PHP,我只会做一个 select * ... 并抓住所有时间,然后做一些 PHP 计算来找到所有的统计信息,但我知道MySQL 可以通过查询为我完成所有这些工作。不幸的是,当涉及到更复杂的查询时,我很迷茫,所以我需要一些帮助。

我想要一些查询的示例,希望一旦有人让我开始,我可以找出其他平均时间查询。玩棋盘游戏的平均时间最长的查询是什么样的?平均最快的游戏/设置时间怎么样?

其他信息: draw010 - 你让我有了一个很好的开始,但我没有得到预期的结果。我给你举了一些真实的例子... 我有一个名为 Harper 的游戏,它已经玩了两次(所以数据库中有两条时间完整的记录)。以下是它的时代:

beginSetup(1) = 2012-07-25 12:06:03
startPlay(1) = 2012-07-25 12:47:14
gameEnd(1) = 2012-07-25 13:29:45

beginSetup(2) = 2012-08-01 12:06:30
startPlay(2) = 2012-08-01 12:55:00
gameEnd(2) = 2012-08-01 13:40:32

当我运行你提供给我的查询时(我将秒转换为小时/分钟/秒)我得到了这些结果(抱歉,我不知道如何做你做的很酷的表):

gameName = Harper
Total Time = 03:34:32
...and other incorrect numbers.

从数字来看,平均总时间应该约为 1 小时 24 分钟 - 而不是 3 小时 34 分钟。知道为什么我会得到不正确的数字吗?

【问题讨论】:

  • 在不知道您的表格是什么样子的情况下无法回答您。否则我们只是在黑暗中扔飞镖。
  • “平均最长的时间”?我不确定我是否跟随。如果您没有子组可以从中获取“最长时间”,您如何平均“最长时间”?
  • @Palladium 我认为 OP 想要一个查询来完成所有这些操作。
  • 你的时间列是unix时间戳(即整数)还是字符串(YYYY-MM-DD H:i:s)?
  • 您尝试过哪些查询?我想你可能会想要使用 GROUP BY,计算差异,以及使用 COUNT。 . .

标签: php mysql sql time average


【解决方案1】:

这是一个查询,用于获取每场比赛的平均准备时间和上场时间,希望对您有所帮助:

SELECT
  gameName,
  AVG(UNIX_TIMESTAMP(startPlay) - UNIX_TIMESTAMP(beginSetup)) AS setupTime,
  AVG(UNIX_TIMESTAMP(gameEnd) - UNIX_TIMESTAMP(startPlay)) AS gameTime,
  AVG(UNIX_TIMESTAMP(gameEnd) - UNIX_TIMESTAMP(beginSetup)) AS totalTime,
FROM `table`
GROUP BY gameName
ORDER BY totalTime DESC;

应该产生类似于:

+----------+-----------+-----------+-----------+
| gameName | setupTime | gameTime  | totalTime |
+----------+-----------+-----------+-----------+
| chess    | 1100.0000 | 1250.0000 | 2350.0000 |
| checkers |  466.6667 |  100.5000 |  933.3333 |
+----------+-----------+-----------+-----------+

我刚刚插入了大约 8 个测试行和一些随机数据,所以我的数字没有意义,但这就是你会得到的结果。

请注意,这将扫描您的整个表,因此可能需要一段时间,具体取决于您在此表中的记录数。如果你有大量的游戏记录,这绝对是你想要定期在后台运行的东西。

【讨论】:

  • 这很接近,但它给了我一些奇数,我不知道它是如何得出的。例如,我有“游戏 1”,它有两条记录和这些时间: beginSetup(1) = 2012-07-25 12:06:03 gameEnd(1) = 2012-07-25 13:29:45 beginSetup(2 ) = 2012-08-01 12:06:30 游戏结束(2) = 2012-08-01 13:40:32。当我这样做时:codeSELECT gameName, AVG(startPlay - beginSetup) AS setupTime, AVG(gameEnd - startPlay) AS gameTime, AVG(gameEnd - beginSetup) AS totalTime, FROM table GROUP BY gameName ORDER BY totalTime DESC;
  • 我在想你的值是 unix 时间戳。尝试在查询中将所有时间转换为 unix 时间戳。示例:SELECT gameName, AVG(UNIX_TIMESTAMP(startPlay) - UNIX_TIMESTAMP(beginSetup)) AS setupTime, AVG(UNIX_TIMESTAMP(gameEnd) - UNIX_TIMESTAMP(startPlay)) AS gameTime, AVG(UNIX_TIMESTAMP(gameEnd) - UNIX_TIMESTAMP(beginSetup)) AS totalTime, FROM table GROUP BY gameName ORDER BY totalTime DESC;
  • 转换为 unix 时间戳就可以了。非常感谢!
【解决方案2】:

对于设置需要多长时间,您可以编写如下内容:

SELECT DATEDIFF(HOUR, BeginSetup, StartTime) -- in hours how long to set up

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2021-06-04
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    相关资源
    最近更新 更多