2012-05-02 158 views
1
 > 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 

問:計算單/每天每個用戶的總時間 - PHP/MySQL的

我怎麼能計算出每一天的每一個用戶的總時間(「開始」,「停止」)每天?請參閱上面突出顯示的點。假設,如果用戶今天開始並明天停止,那麼今天的小時不同,明天的小時不同?

現在我使用下面的查詢: -

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(stopstart))))AS時間1,時鐘。 * FROM table_name的WHERE pin_number = '2001' GROUP BY DATE_FORMAT(start, '%W%M%Y')

從上面的查詢我每天記錄得到我,但是當開始日期和結束日期是不同的。它計算的總時間不是單日的時間,但我需要每天的時間。

+0

那麼你在做什麼?如果不是,發生了什麼問題?你有錯誤嗎?或者你期待/得到什麼結果? – liquorvicar

+0

問題是他在開始日分組,所以如果開始時間是星期一而停止時間是某個星期三,它可以從48小時到一天。 – nvuono

回答

1

我想我終於到了那裏。您首先需要獲得一組天,我通過一個子查詢獲得開始和結束時間爲UNION(如果需要,您可以將其過濾爲pinnumber以減小JOIN的大小)。

然後,將每個這樣的日期與那些包含該日期的日期(即,在白天開始,或者一天的開始在開始和停止時間之間)結合。

最後,每天一組,並將開始和結束時間之間的時間總和,在適當的時候在一天的開始和結束時切斷(魔術86400是一天中的秒數= 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

相關問題