mysql获取小时/分钟/秒的总和

时间:2012-07-27 03:39:39

标签: mysql date timestamp

每次用户打开页面时,我都会有一个表格,其中包含:用户ID 时间戳

我正在努力获得出现的小时 / 分钟 / / 的总量多个用户的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

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

2 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分: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倍。

但同样,我不清楚你想要回归的结果集。但这似乎是一个比以前“选择”的答案更合理的结果集。