【问题标题】:mysql get sum of hours / minutes / secondsmysql获取小时/分钟/秒的总和
【发布时间】:2012-07-27 03:39:39
【问题描述】:

我有一个表格:useridtimestamp 每次用户打开一个页面时都会插入一个新字段。

我正在尝试获取小时 / 分钟 / / 出现在多个用户的间隔为 1 个月。

我尝试了一堆不同的查询,但每个查询都非常低效。

理想情况下,我希望得到类似的结果:

   userid | minutes | hours | days | weeks
      1      10080     168      7      1
      2       1440      24      1      0

希望有人可以阐明如何做到这一点。

以下是我尝试过的查询:

  SELECT 
    w.time AS `week`, 
    d.time AS `day`, 
    h.time AS `hour`, 
    m.time AS `minutes`
    FROM (
             SELECT 
            SUM( t.time ) AS `time`
             FROM (
                    SELECT 
                    COUNT( DISTINCT WEEK( `timestamp` ) ) AS `time`
                FROM table
                    WHERE 
                    userid =  "1"
                    AND 
                    `timestamp` > DATE_SUB( NOW( ) , INTERVAL 1 MONTH ) 
                    GROUP BY MONTH( `timestamp` )
                    ) t
         ) w, 
        (
             SELECT 
            SUM( t.time ) AS `time`
             FROM (
                    SELECT 
                    COUNT( DISTINCT DAY( `timestamp` ) ) AS `time`
                    FROM table
                    WHERE 
                    userid =  "52"
                    AND 
                    `timestamp` > DATE_SUB( NOW( ) , INTERVAL 1 MONTH ) 
                    GROUP BY MONTH( `timestamp` )
             ) t
            ) d,
         (
        SELECT 
            SUM( t.timestamp ) AS `time`
            FROM (
                SELECT 
                    COUNT( DISTINCT HOUR( `timestamp` ) ) AS `time`
                    FROM table
                    WHERE 
                    userid =  "1"
                    AND 
                    `timestamp` > DATE_SUB( NOW( ) , INTERVAL 1 MONTH ) 
                GROUP BY DAY( `timestamp` )
                 ) t
            ) h, 
        (
            SELECT 
            SUM( t.timestamp ) AS `time`
            FROM (
                SELECT 
                    COUNT( DISTINCT MINUTE( `timestamp` ) ) AS `time`
                 FROM table
                WHERE 
                    userid =  "1"
                AND 
                    `timestamp` > DATE_SUB( NOW( ) , INTERVAL 1 MONTH ) 
                    GROUP BY HOUR( `timestamp` )
             ) t
         ) m

这个任务似乎太过分了,也许有人有更好的东西?

【问题讨论】:

  • 您尝试过哪些查询?我很难理解您的源数据。
  • inefficient. - 你如何衡量效率?
  • 我只是在思考这个问题并创建了一些奇怪的查询。抱歉,我没有费心添加它们,因为它们很古怪
  • 我很难理解为什么您需要所选答案中的查询返回的结果集。具有两行时间戳为“2012-07-25 22:55:30”的用户 ID 的分钟值为 55+55=110。具有四行时间戳为 '2012-07-25 23:02:15' 的用户 ID 的分钟值为 02+02+02+02= 8。我只是无法思考该结果集是什么问题答案,或者为什么您希望将其作为结果集。这对我来说似乎很奇怪,因为我无法理解这需要什么。 (我的答案是完全不同的方向。)
  • 你说得对,在测试时它并没有给我想要的东西,我只是看了一眼,认为这是我所期待的简单解决方案并接受了它。事实证明,这就是那些日子之一。我很想看看你想出了什么解决方案。我将发布我遇到的一个问题,这似乎是一项简单的任务,我不知道为什么它让我如此悲伤!

标签: mysql date timestamp


【解决方案1】:

我不清楚你想要“总计”什么。

如果您想确定用户在一个月内的任何给定分钟是否有“点击”(或您存储在表中的任何交易),然后您想计算“分钟周期”的数量" 一个月内用户点击:

 SELECT t.userid
      , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%Y-%m-%d %H:%i')) AS minutes
      , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%Y-%m-%d %H'   )) AS hours
      , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%Y-%m-%d'      )) AS days
      , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%X-%V'         )) AS weeks
 FROM mytable t
WHERE t.timestamp >= '2012-06-01'
  AND t.timestamp <  '2012=07-01'
GROUP BY t.userid 

这样做的目的是获取每个时间戳,并将其放入“桶”中,通过截断秒数、截断分钟数、截断时间等方式。

基本上,我们采用时间戳(例如'2012-07-25 23:15:30')并将其分配给

minute '2012-07-25 23:15'
hour   '2012-07-25 23'
day    '2012-07-25'

'2012-07-25 23:25:00' 的时间戳将被分配给

minute '2012-07-25 23:25'
hour   '2012-07-25 23'
day    '2012-07-25'

然后我们检查并计算我们分配时间戳的不同存储桶的数量。如果这是该用户当月的所有点击次数,则查询将返回 2 表示分钟数,返回 1 表示所有其他时段计数。

对于一个月内只有一次点击的用户,该用户的所有计数都将为 1。

对于在同一分钟内完成所有“点击”的用户,查询将再次为所有计数返回 1。

(对于一个月内没有“点击”的用户,将不会返回任何行。(如果您想返回零计数,则需要加入另一个行源以获取用户列表。)

对于一天内每秒都有“命中”的用户,此查询将返回与示例中用户 ID 2 显示的计数类似的计数。

此结果集为您提供一个月内用户活动的一种指示...用户在一个月内活动了多少“分钟时段”。

“天”可以返回的最大值是该月的天数。 “小时”返回的最大可能值将是该月时间中天数的 24 倍。 “分钟”返回的最大可能值是该月天数的 1440 倍。

但是,我并不完全清楚您想要返回什么结果集。但这似乎比之前“选择”答案中的结果集更合理。

【讨论】:

  • 完美且解释得很好,用户活动正是我想要实现的目标,我很抱歉没有很好地解释自己。
  • @Corey:当我第一次阅读你的问题时,这就是我认为你想要的,然后我看到了选定的答案,我是“WAT?”,然后我完全糊涂了。我认为的另一种可能性是,您可能想知道最大值为 24 的“小时”......一个每天活跃的用户,但只在下午 5 点到 6 点之间,他们会得到 1 的计数。(我认为您可以通过省略日期部分来了解如何扩展相同的 DATE_FORMAT 方法来实现这一点...)
【解决方案2】:
SELECT userid, SUM(MINUTE(timestamp)) AS minutes, SUM(MINUTE(timestamp))/60 AS hours, SUM(MINUTE(timestamp))/(60*24) AS days, SUM(MINUTE(timestamp))/(60*24*7) AS weeks
FROM Table
GROUP BY userid

如果需要,如果需要整数,请使用ROUND(SUM(MINUTE(timestamp)), 0)

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2014-10-17
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多