首页 > 解决方案 > MySQL 将状态更改日期转换为状态持续时间

问题描述

所以基本上我有一个记录用户状态更改的表(用户上线,用户下线等)

我想创建一个具有这些状态持续时间的表(用户从 [日期] 到 [日期] 在线,用户从 [日期] 到 [日期] 离线)

怎么做这样的事情?甚至可以仅使用 MySQL 语句吗?

附加信息:日期存储为 unix 时间戳,数据类型为int(12)

标签: mysql

解决方案


起初我考虑在一个过程中遍历行,但后来我意识到这UPDATE也会遍历它们。

我在现有表中添加了三个新列(而不是为此创建新表),它们如下:

  • rowid(用于标识函数中的行)
  • 时间结束
  • 期间

我创建了一个函数来获取一行的结束时间。

这是我想要实现的 步骤(每个步骤都是一个单独的查询)

1:如果存在则删除该函数

DROP FUNCTION IF EXISTS NEXTDATE;

2:创建函数

CREATE FUNCTION NEXTDATE (thisrowid mediumint(9), thistime int(12))
RETURNS int(12)
DETERMINISTIC

BEGIN
    
    SELECT userid INTO @userid FROM status WHERE rowid = thisrowid;
    SELECT status INTO @status FROM status WHERE rowid = thisrowid;
    SELECT MIN(time) INTO @endtime FROM status WHERE userid = @userid AND
        time > thistime AND status != @status;

    RETURN @endtime;

END;

3:更新行

UPDATE status
SET endtime = NEXTDATE(rowid,time), duration = endtime - time

推荐阅读