计算每个用户每天/每天的总时间 - php / mysql

时间:2012-05-02 10:42:14

标签: php mysql

     > Start                    stop                  pinnumber
     > ---------------------------------------------------------
     > 2012-03-14 13:22:17    2012-03-14 15:22:50      2001
     > 2012-03-14 18:11:10    2012-03-14 19:10:10      2001
     > 2012-03-15 07:20:10    2012-03-15 13:20:50      2001
     >**2012-03-16 19:21:55       2012-03-17 02:55:22  2001** //on 16(19:21:55
                                                                     to 23:59:59) and     
                                                                 //on 17(00 to 02:55:22) 
     > 2012-03-17 14:15:05    2012-03-17 17:44:50      2001
     > 2012-03-18 19:11:10    2012-03-18 19:10:10      2002
     > 2012-03-18 10:20:10    2012-03-18 13:20:50      2003
     > 2012-03-18 11:20:10    2012-03-18 15:11:50      2001

问题:

如何计算每天每位用户的总时间(“开始”,“停止”)?请参阅上面突出显示的要点。假设,如果用户今天“开始”并明天停止,那么今天小时是不同的,明天小时是不同的?

现在我正在使用以下查询: -

  

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(stopstart))))AS time1,clock。 * FROM table_name WHERE pin_number ='2001'GROUP BY DATE_FORMAT(start,'%W%M%Y')

从上面的查询我得到每日记录,但开始日期和停止日期不同。它计算的总时间不是单日时间,而是我每天需要的时间。

1 个答案:

答案 0 :(得分:1)

我想我终于到了那里。您首先需要获得一组天数,我通过一个子查询获得该天数,该子查询需要UNION的开始和停止时间(如果需要,您可以为pinnumber过滤此项以减小尺寸JOIN)。

然后,每个这样的日期加入包含该日期的(start,stop)对(即,在白天开始,或者在一天的开始时间在开始和停止时间之间)。

最后,按天分组,取出开始和结束时间之间的时间总和,在适当的时间开始和结束时切断(魔术86400是一个秒数。 day = 24 * 60 * 60)。可悲的是,这对于夏令时,闰秒等都不会很好......

SELECT FROM_UNIXTIME(unixday, '%d/%m/%Y'), SUM(
    LEAST(   unixday+86400, UNIX_TIMESTAMP(Stop ))
  - GREATEST(unixday      , UNIX_TIMESTAMP(Start))
) AS Seconds
FROM table_name JOIN (

  SELECT UNIX_TIMESTAMP(DATE(Start)) AS unixday FROM table_name
UNION 
  SELECT UNIX_TIMESTAMP(DATE(Stop )) AS unixday FROM table_name

) AS days ON (
      UNIX_TIMESTAMP(Start) BETWEEN unixday AND unixday+86400
  OR (unixday BETWEEN UNIX_TIMESTAMP(Start) AND UNIX_TIMESTAMP(Stop))
)
WHERE pinnumber = 2001
GROUP BY unixday;

sqlfiddle上查看。