Определить сеансы пользователей в Mysql - PullRequest
0 голосов
/ 22 февраля 2020

как я могу определить время сеанса этих фиктивных пользователей? Например, для пользователя 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

1 Ответ

1 голос
/ 22 февраля 2020

Это показывает, как вы можете выполнить sh, что в 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         
:------- | -----: | :------------------
<em>null</em>     |      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
<em>null</em>     |      2 | 2020-02-20 15:08:22
00:07:00 |      2 | 2020-02-20 15:15:22
<em>null</em>     |      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

дБ <> скрипка здесь

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...