3

私はさまざまなタスクに「クロックイン」できる非常に単純なアプリケーションを構築しています。このために、MySQL に次のようなデータベーステーブルがあります。

|ID|user_id |task_id|checkin_time       |checkout_time
------------------------------------------------------------
|31|2       |289    |2012-07-12 09:50:03|2012-07-12 09:51:27
|32|2       |289    |2012-07-12 10:00:05|2012-07-12 13:00:05

SQL クエリを使用してこれから取得したいのは、ユーザーが先週チェックインした 1 日あたりの合計時間です。私はこのクエリを試しました:

SELECT COUNT( id ) AS time_id, SUM( checkout_time - checkin_time ) AS total_time, DATE( checkout_time ) AS checkout_day
FROM time_table
WHERE user_id =  '2'
AND checkout_time >= ( DATE_SUB( CURDATE( ) , INTERVAL 1 WEEK ) ) 
GROUP BY checkout_day
ORDER BY checkout_day ASC

これは非常に良い結果をもたらしますが、1 日に複数の「チェックイン」がある場合SUM( checkout_time - checkin_time )(最初の checkin_time と最後の checkout_time のように) は、ユーザーがチェックインされた時間を必ずしも表しているとは限りません。 (彼が100%の時間でチェックされていない限り).

私が欲しいのは、SUM() が各合計を取り、それらを毎日加算することです。

これを修正する方法についてのアイデアはありますか?

4

2 に答える 2

2

サブクエリを使用して時差を取得し、後で合計します。

SELECT 
  COUNT( id ) AS time_id, 
  SUM( time_diff ) AS total_time, 
  DATE( checkout_time ) AS checkout_day
FROM (
  select 
    id, 
    checkout_time - checkin_time as time_diff, 
    checkout_time
  from time_table)
WHERE user_id =  '2'
AND checkout_time >= ( DATE_SUB( CURDATE( ) , INTERVAL 1 WEEK ) ) 
GROUP BY checkout_day
ORDER BY checkout_day ASC
于 2012-07-19T07:04:01.997 に答える
1

これを試して:

「日数」の違い:

SELECT COUNT( id ) AS time_id, SUM( TO_DAYS(checkout_time) - TO_DAYS(checkin_time) ) AS total_time, DATE( checkout_time ) AS checkout_day
FROM time_table
WHERE user_id =  '2'
AND checkout_time >= ( DATE_SUB( CURDATE( ) , INTERVAL 1 WEEK ) ) 
GROUP BY checkout_day
ORDER BY checkout_day ASC

「秒」の違い:

SELECT COUNT( id ) AS time_id, SUM( UNIX_TIMESTAMP(checkout_time) - UNIX_TIMESTAMP(checkin_time) ) AS total_time, DATE( checkout_time ) AS checkout_day
    FROM time_table
    WHERE user_id =  '2'
    AND checkout_time >= ( DATE_SUB( CURDATE( ) , INTERVAL 1 WEEK ) ) 
    GROUP BY checkout_day
    ORDER BY checkout_day ASC
于 2012-07-19T07:14:16.407 に答える