Определить пользовательские сессии в Mysql

как я могу определить время сеанса этих фиктивных пользователей? Например, для пользователя 1 я предполагаю, что между 08:24:08 и 15:08:20 его не было, поэтому я не добавляю этот временной интервал, я добавляю другие времена.

Поэтому я ищу способ сложить (в секундах или минутах) промежуточное время на основе этой таблицы. Любые идеи.

drop table sessions;
CREATE TABLE IF NOT EXISTS sessions (    
    id_user int(11),
    start_date datetime
);

insert into sessions values (1,'2020-02-21 08:24:07');
insert into sessions values (1,'2020-02-21 08:24:08');--> 1 seg (08:24:08 - 08:24:07)
insert into sessions values (1,'2020-02-21 15:08:20');
insert into sessions values (1,'2020-02-21 15:08:21');--> 1 seg (15:08:21 - 15:08:20)
insert into sessions values (1,'2020-02-21 15:08:22');--> 1 seg 
insert into sessions values (2,'2020-02-20 15:08:22');
insert into sessions values (2,'2020-02-20 15:15:22');--> 7 min (15:15:22 - 15:08:22)
insert into sessions values (3,'2020-02-20 15:08:22');
insert into sessions values (3,'2020-02-20 15:15:22');--> 7 min
insert into sessions values (3,'2020-02-20 15:20:22');--> 5 min

person Raymont    schedule 21.02.2020    source источник
comment
для пользователя 1 я предполагаю, что между 08:24:08 и 15:08:20 его там не было: откуда вы это знаете? Пожалуйста, объясните логику.   -  person GMB    schedule 22.02.2020
comment
@GMB Очевидно, они попеременно прибывают и уходят.   -  person Barmar    schedule 22.02.2020
comment
Было бы лучше, если бы вы явно указали это в данных, а не делали вывод. Ваш текущий дизайн требует, чтобы вы возвращались к началу каждого пользователя, чтобы выяснить, какие из них приходят, а какие уходят.   -  person Barmar    schedule 22.02.2020
comment
@Barmar: Я не уверен... У нас есть две последовательные записи для пользователя 1, которые учитываются: 15:08:20 › 15:08:21 и 15:08:21 › 15:08:22. Может быть, они хотят игнорировать последовательные записи, которые имеют временной интервал больше определенного?   -  person GMB    schedule 22.02.2020
comment
Конечно, это часть предположения. У меня есть временные записи в системе, как вы видите в таблице примеров. И я должен сделать вывод, сколько реального времени было у пользователя.   -  person Raymont    schedule 22.02.2020


Ответы (1)


Это показывает вам, как вы можете сделать это в mysql 5.x и выше.

Пожалуйста, прочитайте текст в конце для получения дополнительной информации

CREATE TABLE IF NOT EXISTS `sessions` (    
    id_user int,
    `start_date` datetime
);

insert into `sessions` values (1,'2020-02-21 08:24:07');
insert into `sessions` values (1,'2020-02-21 08:24:08');
insert into `sessions` values (1,'2020-02-21 15:08:20');
insert into `sessions` values (1,'2020-02-21 15:08:21');
insert into `sessions` values (1,'2020-02-21 15:08:22');
insert into `sessions` values (2,'2020-02-20 15:08:22');
insert into `sessions` values (2,'2020-02-20 15:15:22');
insert into `sessions` values (3,'2020-02-20 15:08:22');
insert into `sessions` values (3,'2020-02-20 15:15:22');
insert into `sessions` values (3,'2020-02-20 15:20:22');
✓

✓

✓

✓

✓

✓

✓

✓

✓

✓

✓
SELECT
  IF(@iduser = id_user,TIME_FORMAT(TIMEDIFF(`start_date`,@date), '%H:%i:%S'), NULL) Datediff
  ,@iduser := id_user iduser
  , @date := `start_date` `start_date`
 FROM
  (SELECT * FROM sessions ORDER by id_user ASC, start_date ASC) t
  ,(SELECT @iduser := 0) a,(SELECT @date := 0) b;
Datediff | iduser | start_date         
:------- | -----: | :------------------
null     |      1 | 2020-02-21 08:24:07
00:00:01 |      1 | 2020-02-21 08:24:08
06:44:12 |      1 | 2020-02-21 15:08:20
00:00:01 |      1 | 2020-02-21 15:08:21
00:00:01 |      1 | 2020-02-21 15:08:22
null     |      2 | 2020-02-20 15:08:22
00:07:00 |      2 | 2020-02-20 15:15:22
null     |      3 | 2020-02-20 15:08:22
00:07:00 |      3 | 2020-02-20 15:15:22
00:05:00 |      3 | 2020-02-20 15:20:22

db‹>скрипка здесь

Он использует TIMEDIFF для получить разницу между строками.

И использует TIME_FORMAT чтобы избавиться от миллисекунд.

Новый столбец Datediff находится в начале и должен остаться там, чтобы алгоритм мог работать. Если вы хотите переупорядочить его в mysql, вам нужен новый внешний запрос SELECT.

Последняя проблема с этим алгоритмом заключается в том, что он просто делает время1 - время2, ему все равно, начнется ли новый день, он все равно сделает это для каждого id_user. Можно использовать гораздо более сложные предложения ORDER BY.

person nbk    schedule 21.02.2020
comment
Спасибо! Таким образом, я могу исключить нулевые и, с другой стороны, установить критерий для исключения временных различий, превышающих (пример) 30 минут. - person Raymont; 22.02.2020