ログイン/ログアウトを記録しているテーブルがあります。スキーマとサンプルデータ:http ://sqlfiddle.com/#!2 / e1b35 / 1
ユーザーの(logout-login)時間と日付(日付のユーザーのアプリケーションの使用期間)の合計を出力するストアドプロシージャを作成する必要があります。列タイプでは、IはログインとOログアウトを表します。
入力パラメーター:@ username、@date。出力:時間。
ログイン/ログアウトを記録しているテーブルがあります。スキーマとサンプルデータ:http ://sqlfiddle.com/#!2 / e1b35 / 1
ユーザーの(logout-login)時間と日付(日付のユーザーのアプリケーションの使用期間)の合計を出力するストアドプロシージャを作成する必要があります。列タイプでは、IはログインとOログアウトを表します。
入力パラメーター:@ username、@date。出力:時間。
相互に関連するログインのすべてのグループを識別する必要があります。これを行う方法は、ログインに関連付けられているログアウトを見つけることです。あなたはログデータを扱っているので、ログアウトせずに複数のログインがある場合でも驚かないでください。
select l.*,
(select min(l2.time) from logs l2 where l2.username = l.username and l2.type = 'O' and l2.time > l.time
) as logoutTime
from logs l
where l.type = 'I'
これで、ユーザー名とLogoutTimeをペアとして使用して集計し、必要なものを取得できます。
select username, logoutTime, min(time) as StartTime, logouttime as EndTime,
datediff(s, min(time), logoutTime) as TimeInSeconds
from (select l.*,
(select min(l2.time) from logs l2 where l2.username = l.username and l2.type = 'O' and l2.time > l.time
) as logoutTime
from logs l
where l.type = 'I'
) l
group by username, logoutTime
タグとしてSQLServerを指定しますが、SQLFiddleはMySQL用であることに注意してください。日付関数はデータベース間で異なる傾向があります。
また、SQL Server 2012を使用している場合は、より簡単な方法があります。その場合は、それを指定する必要があります。
これはGordonLinoffのソリューションであり、最も外側のレベルの集計が含まれないように変更され、より明確なエイリアスであるIMOが使用されます。
select username,time_in,time_out_min,
datediff(s, time_in, time_out_min) as TimeInSeconds
from (
select i.username, i.time as time_in,
(select min(o.time) as min_time_out
from logs o
where o.username = i.username and
o.type = 'O' and
o.time > i.time
) as time_out_min
from logs i
where i.type = 'I'
) d;