2011-08-16 12 views
3

mysql> select * from timing;mysqlの特定のユーザの総ログインログアウト時間を計算する

+--------------+---------------------+-----------------+ 
| employeeIdNo | employeeLogTime  | employeeLogType | 
+--------------+---------------------+-----------------+ 
|   1 | 2011-08-16 09:53:29 | login   | 
|   1 | 2011-08-16 10:45:42 | logout   | 
|   1 | 2011-08-16 10:55:29 | login   | 
|   1 | 2011-08-16 17:55:39 | logout   | 
+--------------+---------------------+-----------------+ 

私は上記のデータを使用している従業員の総勤務時間を表示したいと考えています。だから私は、employeeIdNo = 1の合計時間を計算するmysqlクエリが欲しい。私のテーブル名はタイミングで、employeeIdNoはテーブルemployeeからの外部キー参照です。計算後、totalLogTimeの値= 7:52:23を返します。適切な質問を私に提供してください。前もって感謝します。

+1

あなたがこれまでに行っていますか?これが問題です! –

+2

データがフォーム(SessionID、EmployeeID、LoginTime、LogoutTime)になるようにデータを再構成した場合、クエリは非常に簡単になり、実際にデータを失うことはありません。 –

+1

2回目のクライアントを使用して2回目のセッションを開始すると、ユーザーが2回ログインする可能性がありますか?その場合、正しいログイン/ログアウトタイムスタンプのペアを見つけるためにsessionIDを保存する必要があります。 –

答えて

1

多くの意味があります。また、ログアウト時にセッションごとに期間を計算するよりよい方法がある - これは厳密に正規化されていないものの、それは計算の負荷を分散....

SELECT ilv.employee, 
SUM(UNIX_TIMESTAMP(logouttime) 
    - IF(logintime IS NULL, 
     UNIX_TIMESTAMP(logouttime), 
     UNIX_TIMESTAMP(logintime))) 
FROM (
    SELECT a.employeeId, a.time AS logouttime, 
    (SELECT MAX(b.time) 
     FROM log b 
     WHERE b.employeeId=a.employeeId 
     AND b.time<a.time 
     AND b.type='login') as logintime 
    FROM log a 
    WHERE a.type='logout' 
    AND a.time BETWEEN <range start> AND <range end> 
    AND employeeId=1 /* optional */ 
) ilv 
GROUP BY ilv.employeeId