Comment puis-je déterminer les heures de session de ces utilisateurs fictifs ? À titre d'exemple, pour l'utilisateur 1, je suppose qu'entre 08:24:08 et 15:08:20 il n'était pas là, donc je n'ajoute pas cet intervalle de temps, j'ajoute les autres fois.

Je cherche donc une méthode pour additionner (en secondes ou minutes) les temps intermédiaires en fonction de ce tableau. Des idées.

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
0
Raymont 22 févr. 2020 à 00:39

1 réponse

Meilleure réponse

Cela vous montre comment vous pouvez accomplir cela dans mysql 5.x et supérieur

Veuillez lire le texte à la fin pour plus d'informations

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<>fiddle ici

Il utilise TIMEDIFF pour obtenir la différence entre les lignes.

Et les utilise TIME_FORMAT pour se débarrasser des millisecondes.

La nouvelle colonne Datediff est au départ et doit y rester pour que l'Algorithme peut fonctionner. Si vous souhaitez le réorganiser dans mysql, vous avez besoin d'une nouvelle requête externe SELECT.

Le dernier problème avec cet algorithme est qu'il rend simple time1 - time2, peu importe si un nouveau jour commence, il le ferait toujours pour chaque id_user. Il est possible d'utiliser des clauses ORDER BY beaucoup plus sophistiquées.

1
nbk 21 févr. 2020 à 23:35