2014-09-13 46 views
2
計算登錄時間間隔

考慮下面DDL & DML:在MySQL

CREATE TABLE `EventLog` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `actiontype` varchar(20) NOT NULL, 
    `executiondate` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=latin1; 


INSERT INTO EventLog (actiontype,executiondate) 
values 
('LOGIN','2014-09-12 12:34:37'), 
('LOGOUT','2014-09-12 12:58:37'), 
('LOGIN','2014-09-12 13:12:25'), 
('LOGOUT','2014-09-12 14:25:37'), 
('LOGIN','2014-09-12 16:45:00'), 
('LOGOUT','2014-09-12 18:00:31'), 
('LOGIN','2014-09-12 20:05:37'), 
('LOGOUT','2014-09-12 20:34:37'), 
('LOGIN','2014-09-13 02:15:10'), 
('LOGOUT','2014-09-13 03:05:22'), 
('LOGIN','2014-09-13 06:10:45'), 
('LOGOUT','2014-09-12 08:34:37'); 

現在我要計算登錄時間間隔。
例如我有開始日期時間 - > 2014-09-12 12:44:37結束日期時間 - > 2014-09-12 12:59:37。這裏的用戶在2014-09-12 12:59:37登錄系統,但我們的輸入開始日期時間比它大。所以考慮輸入開始日期時間。輸入結束日期時間大於註銷日期時間(在mysql表格數據 - 2014-09-12 12:59:37檢查),然後考慮註銷日期時間。

按照此邏輯,對於這種情況,輸出將是14最小
這是SQL Fiddle練習。
在此先感謝

編輯:最新SQL Fiddle與username列。

+1

我覺得缺少用戶列,沒有它,你可以假設登錄之後的下一個記錄是註銷。與此嘗試'SELECT a.Id 「A ID」 ,b.Id 「B ID」 ,a.ActionType 「A行動」 ,b.ActionTYpe 「B行動」 ,a.ExecutionDate 「A ExecutionDate」 ,b.ExecutionDate「B ExecutionDate」 ,TIMESTAMPDIFF(SECOND,a.executiondate,b.executiondate)「Time」 FROM EventLog內部連接EventLog b 其中(a.id + 1)= b.id 和a。 ActionType ='LOGIN'' – Max 2014-09-13 13:09:05

+0

這不是按照我的邏輯,再次閱讀問題。 – unknown 2014-09-13 13:37:45

回答

1

試試這個:

SELECT ins.id, outs.id, logindate, logoutdate, 
     (UNIX_TIMESTAMP(logoutdate) - UNIX_TIMESTAMP(logindate))/60 AS LoginTime_mins 
FROM 
     (select id, executiondate as logindate from EventLog where actiontype = 'LOGIN') as ins 
JOIN 
     (select id, executiondate as logoutdate from EventLog where actiontype = 'LOGOUT') as outs 
ON ins.id = outs.id -1 
+0

我感謝你的工作,但我沒有在這裏提到userloginId。將有多個用戶的多個記錄。所以最後的情況現在會起作用。 – unknown 2014-09-25 13:50:41

+0

你可以請更新你的sqlfiddle這個額外的專欄? – Benvorth 2014-09-25 14:55:16