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

質問:

1日あたりの各ユーザーの合計時間(「開始」、「停止」)を計算するにはどうすればよいですか?上記の強調点をご覧ください。たとえば、ユーザーが今日「開始」して明日停止した場合、今日の時間は異なり、明日の時間は異なりますか?

現在、次のクエリを使用しています:-

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日あたりのレコードを取得していますが、開始日と終了日が異なる場合。それは一日の時間ではなく合計時間を計算しますが、私は一日の時間を必要とします。

4

1 に答える 1

2

やっとそこに着いたと思います。最初に一連の日数を取得する必要があります。これは、開始時間と停止時間を取得するサブクエリを通じて取得します(必要に応じて、サイズを小さくするためにUNIONこれをフィルタリングできます)。pinnumberJOIN

次に、そのような各日付を、その日付を含むペアと結合(start,stop)します(つまり、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でそれを参照してください。

于 2012-05-02T11:02:20.613 に答える