2012-05-02 13 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の

がどのように私は1日当たりの各ユーザーの合計時間(「開始」、「停止」)を計算することができます?上記の強調表示をご覧ください。ユーザーが今日「スタート」して明日停止した場合、今日の時間は異なり、明日の時間は異なりますか? TIME1、クロックとして

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(stopstart)))) - :

今の私は、次のクエリを使用しています。 * pin_number = '2001' GROUP BY DATE_FORMAT(start、 '%のWの%のM%Y')

TABLE_NAME FROMクエリの上から、私は一日レコードごとに取得していますが、開始日と終了日が異なる場合。 1日の時間ではなく合計の時間を計算しますが、1日の時間が必要です。

+0

あなたは何をしているのですか?そうでない場合、何がうまくいかないのですか?間違いはありますか?またはあなたはどんな結果を期待していますか? – liquorvicar

+0

問題は開始日までにグループ分けされているため、開始日が月曜日であり、停止はいつか水曜です。 – nvuono

答えて

1

私は最終的にそこに着いたと思います。最初に、開始時刻と終了時刻をUNIONにするサブクエリで取得する日数を取得する必要があります(のサイズを小さくするために、必要に応じてpinnumberのためにこれをフィルタリングできます)。

この場合、その日付は、その日付を含むもの(つまり、1日のうちの開始、または1日の開始が開始時間と終了時間の間にあるもの)で結合されます。

最後に、1つずつグループ化し、開始日と終了日の間の時間の合計をとり、開始日と終了日を適切に切り捨てます(86400は1日の秒数= 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でそれを参照してください。