MySQL の最終ログイン時刻をdatetime
-type フィールドに保存しています。ユーザーがログインするときに、最終ログイン時刻と現在時刻 (を使用して取得) の差を取得したいと考えていますNOW()
。
どうすれば計算できますか?
MySQL の最終ログイン時刻をdatetime
-type フィールドに保存しています。ユーザーがログインするときに、最終ログイン時刻と現在時刻 (を使用して取得) の差を取得したいと考えていますNOW()
。
どうすれば計算できますか?
MySQLTIMESTAMPDIFF
関数を使用します。たとえば、次を使用できます。
SELECT TIMESTAMPDIFF(SECOND, '2012-06-06 13:13:55', '2012-06-06 15:20:18')
あなたの場合、TIMSTAMPDIFF
関数の 3 番目のパラメーターは現在のログイン時間 ( NOW()
) になります。2 番目のパラメーターは、データベースに既に存在する最終ログイン時刻です。
ロジックに関する私の 2 セント:
構文は「古い日付」 - :「新しい日付」なので、次のようになります。
SELECT TIMESTAMPDIFF(SECOND, '2018-11-15 15:00:00', '2018-11-15 15:00:30')
30を与える、
SELECT TIMESTAMPDIFF(SECOND, '2018-11-15 15:00:55', '2018-11-15 15:00:15')
与えます: -40
受け入れられた答えは適切ではないと思います。たとえば、最終ログイン時刻と現在時刻の差が 8 時間の場合、差を秒単位で取得するのは非論理的です。正しい形式は、時、分、秒です。これを次のように説明しました-
ここでは、login_info
ユーザーのログイン情報を格納するテーブル table を作成します。
CREATE TABLE login_info (
-> user_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
-> last_login DATETIME NOT NULL,
-> PRIMARY KEY (user_id)
-> );
次に、いくつかのランダムな値を使用してテーブルにデータを入力します -
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");
次に、last_login と current_time の差を次のように計算します。
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 |
+---------+----------------+
ここで、@Adi によって与えられた答えは、@CaiusJard によって指摘されたように常に機能するとは限りません。