Bereken het verschil tussen twee datetimes in MySQL

Ik sla de laatste inlogtijd op in MySQL in, datetime-type gearchiveerd. Wanneer gebruikers inloggen, wil ik het verschil zien tussen de laatste inlogtijd en de huidige tijd (die ik krijg met NOW()).

Hoe kan ik het berekenen?


Antwoord 1, autoriteit 100%

GEBRUIK TIMESTAMPDIFFMySQL-functie. U kunt bijvoorbeeld het volgende gebruiken:

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

In uw geval is de derde parameter van de functie TIMSTAMPDIFFde huidige inlogtijd (NOW()). De tweede parameter is de laatste inlogtijd, die al in de database staat.


Antwoord 2, autoriteit 2%

mijn twee cent over logica:

syntaxis is “oude datum” – :”nieuwe datum”, dus:

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

geeft 30,

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

geeft:
-40


Antwoord 3, autoriteit 2%

Als je begin- en einddatum op verschillende dagen liggen, gebruik dan TIMEDIFF.

SELECT TIMEDIFF(datetime1,datetime2)

if datetime1 > datetime2 dan

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

geeft: 24:01:00

en datetime1 < datetime2

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

geeft: -24:01:00


Antwoord 4

Ik denk niet dat het geaccepteerde antwoord gepast is. Als het verschil tussen de laatste inlogtijd en de huidige tijd bijvoorbeeld 8 uur is, is het onlogisch om het verschil in seconden te krijgen. Het juiste formaat is in uren, minuten en seconden. Ik heb dit als volgt geïllustreerd –

Hier maak ik een tabel login_infotabel aan om inloggegevens van gebruikers op te slaan.

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

Vervolgens vul ik de tabel met enkele willekeurige waarden –

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");

Nu bereken ik het verschil tussen last_login en huidige_time als volgt:

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         |
+---------+----------------+

Hier zal het antwoord van @Adi niet altijd werken zoals aangegeven door @CaiusJard.

Other episodes