2014-09-13 6 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 для практики.
Заранее спасибо

Edit: Последние SQL Fiddle с колонкой имя пользователя.

+1

Я думаю, отсутствует столбец пользователя, без этого можно предположить, что следующая запись после авторизации является Выход. Попробуйте с этим 'ВЫБРАТЬ A.id "ИД" , b.Id "B ID" , a.ActionType "действие" , b.ActionTYpe "B Действие" , a.ExecutionDate "А ExecutionDate" , b.ExecutionDate «B ExecutionDate» , TIMESTAMPDIFF (SECOND, a.executiondate, b.executiondate) «Время» FROM EventLog внутреннее объединение EventLog b где (a.id + 1) = b.id и a. ActionType = 'LOGIN'' – Max

+0

Это не соответствует моей логике, снова прочитайте вопрос. – unknown

ответ

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

+0

Не могли бы вы обновить свой sqlfiddle с помощью этого дополнительного столбца? – Benvorth

Смежные вопросы