【问题标题】:Calculate difference between two datetimes in MySQL计算MySQL中两个日期时间之间的差异
【发布时间】:2012-06-10 02:05:33
【问题描述】:

我将上次登录时间存储在 MySQL 中,datetime-type 字段。当用户登录时,我想获取上次登录时间和当前时间之间的差异(我使用NOW())。

如何计算?

【问题讨论】:

标签: mysql


【解决方案1】:

使用TIMESTAMPDIFF MySQL 函数。例如,您可以使用:

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

在您的情况下,TIMSTAMPDIFF 函数的第三个参数将是当前登录时间 (NOW())。第二个参数是上次登录时间,已经在数据库中了。

【讨论】:

  • 那是更新上次登录的吧??我想要的就像你在 2 秒前、30 秒前、2 分钟前发布的问题在 stackoverflow 中一样。我想要类似的功能。例如,有一张表说 REQUESTS (id, message, timestamp)。存储时的时间戳将是 NOW() 。当我运行查询时,从请求中选择 *,而不是显示该值,它应该显示 id、消息和返回请求的发布时间。
  • 当我正在执行查询 SELECT TIMESTAMPDIFF(SECOND, NOW(), 'select lastLoginTime from requests where id = '2' ').. 它返回 NULL。知道为什么吗??
  • select lastLoginTime from requests where id = '2' 的输出是什么?
  • SELECT TIMESTAMPDIFF(SECOND,NOW(),'2012-06-06 08:07:36');试试这个!
  • 是的,但我需要从表中获取第二个参数。如何实现。事实上我想避免嵌套查询。有什么想法吗?
【解决方案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

【讨论】:

    【解决方案3】:

    如果您的开始和结束日期时间在不同的日期,请使用 TIMEDIFF。

    SELECT TIMEDIFF(datetime1,datetime2)
    

    如果 datetime1 > datetime2 那么

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

    给:24:01:00

    和日期时间1

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

    给出:-24:01:00

    【讨论】:

    • 注意,只能处理相隔最多 839 小时的日期
    【解决方案4】:

    我认为接受的答案不合适。例如,如果上次登录时间和当前时间之间的差异是 8 小时,那么以秒为单位的差异是不合逻辑的。正确的格式是小时、分钟和秒。我已经说明了这一点-

    这里,我创建了一个表login_info来存储用户的登录信息。

    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 指出的那样总是有效。

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 2011-08-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多