182 votes

Calculer la différence entre deux dates dans MySQL

Je stocke la dernière heure de connexion dans MySQL, datetime -type déposé. Lorsqu'un utilisateur se connecte, je veux obtenir la différence entre l'heure de la dernière connexion et l'heure actuelle (que j'obtiens en utilisant NOW() ).

Comment puis-je le calculer ?

335voto

FSP Points 982

UTILISER TIMESTAMPDIFF Fonction MySQL. Par exemple, vous pouvez utiliser :

SELECT TIMESTAMPDIFF(SECOND, '2012-06-06 13:13:55', '2012-06-06 15:20:18')

Dans votre cas, le troisième paramètre de TIMSTAMPDIFF serait l'heure de connexion actuelle ( NOW() ). Le deuxième paramètre serait l'heure de la dernière connexion, qui se trouve déjà dans la base de données.

8voto

ingconti Points 405

Mes deux centimes sur la logique :

La syntaxe est "ancienne date" - : "nouvelle date", donc :

SELECT TIMESTAMPDIFF(SECOND, '2018-11-15 15:00:00', '2018-11-15 15:00:30')

donne 30,

SELECT TIMESTAMPDIFF(SECOND, '2018-11-15 15:00:55', '2018-11-15 15:00:15')

donne : -40

7voto

Adi Points 71

Si les dates de début et de fin sont situées sur des jours différents, utilisez TIMEDIFF.

SELECT TIMEDIFF(datetime1,datetime2)

si date1 > date2 alors

SELECT TIMEDIFF("2019-02-20 23:46:00","2019-02-19 23:45:00")

donne : 24:01:00

et datetime1 < datetime2

SELECT TIMEDIFF("2019-02-19 23:45:00","2019-02-20 23:46:00")

donne : -24:01:00

2voto

Payel Senapati Points 459

Je ne pense pas que la réponse acceptée soit appropriée. Par exemple, si la différence entre l'heure de la dernière connexion et l'heure actuelle est de 8 heures, il est illogique d'obtenir la différence en secondes. Le format correct est celui des heures, des minutes et des secondes. J'ai illustré cela de la manière suivante -

Ici, je crée un tableau login_info pour stocker les informations de connexion des utilisateurs.

CREATE TABLE login_info (
    -> user_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    -> last_login DATETIME NOT NULL,
    -> PRIMARY KEY (user_id)
    -> );

J'alimente ensuite le tableau en utilisant des valeurs aléatoires -

INSERT INTO login_info (last_login) VALUES 
    -> ("2021-09-22 09:32:44"),
    -> ("2021-09-22 13:02:57"),
    -> ("2021-09-21 23:43:21"),
    -> ("2021-09-22 04:43:39"),
    -> ("2021-09-22 17:23:21");

Je calcule maintenant la différence entre last_login et current_time comme suit :

CREATE TABLE login_dur_in_sec AS 
    -> SELECT user_id,
    -> TIMESTAMPDIFF(SECOND, last_login, NOW()) AS diff
    -> FROM login_info;

SELECT * FROM login_dur_in_sec;
+---------+-------+
| user_id | diff  |
+---------+-------+
|       1 | 28580 |
|       2 | 15967 |
|       3 | 63943 |
|       4 | 45925 |
|       5 |   343 |
+---------+-------+

CREATE TABLE hour_section AS 
    -> SELECT user_id,
    -> FLOOR (diff / 3600) AS hour_part 
    -> FROM login_dur_in_sec;

CREATE TABLE minute_section AS 
    -> SELECT user_id, 
    -> FLOOR (MOD (diff, 3600)/ 60) AS minute_part
    -> FROM login_dur_in_sec;

CREATE TABLE second_section AS
    -> SELECT user_id,
    -> MOD (MOD (diff, 3600), 60) AS second_part
    -> FROM login_dur_in_sec;

CREATE TABLE login_dur AS 
    -> SELECT h.user_id, h.hour_part, m.minute_part, s.second_part
    -> FROM hour_section AS h INNER JOIN minute_section AS m
    -> ON h.user_id = m.user_id
    -> INNER JOIN second_section AS s
    -> ON m.user_id = s.user_id;

CREATE TABLE login_dur_trunc AS 
    -> SELECT user_id,
    -> CONCAT (hour_part, ":", minute_part, ":", second_part) AS login_duration
    -> FROM login_dur;

SELECT * FROM login_dur_trunc;
+---------+----------------+
| user_id | login_duration |
+---------+----------------+
|       1 | 8:14:46        |
|       2 | 4:44:33        |
|       3 | 18:4:9         |
|       4 | 13:3:51        |
|       5 | 0:24:9         |
+---------+----------------+

Ici, la réponse donnée par @Adi ne fonctionnera pas toujours comme l'a souligné @CaiusJard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X