在datetime x min ago和datetime x min before之间从mysql表中选择

gan*_*jan 36 mysql sql datetime

我想我在标题中总结得很好.我想从特定时间到另一个特定时间选择在线用户.我的表看起来像这样:

CREATE TABLE online (

    id bigint(20) NOT NULL auto_increment,
    `username` varchar (16) NOT NULL, 
    `ip` varchar(39) NOT NULL default '',   
    `time` datetime NOT NULL default '0000-00-00 00:00:00' ,

      PRIMARY KEY  (id)
);
Run Code Online (Sandbox Code Playgroud)

我想要一个返回username已经联机的查询last 15 minutes.

并查询已在线的用户last 60 minutes, but not the last 15 minutes.因此查询不会返回相同的值.这个我不知道该怎么做.

Mar*_*ers 79

对于您的第一个查询:

SELECT username
FROM online
WHERE time > NOW() - INTERVAL 15 MINUTE
Run Code Online (Sandbox Code Playgroud)

而对于你的第二个:

SELECT username
FROM online
WHERE time BETWEEN NOW() - INTERVAL 60 MINUTE AND NOW() - INTERVAL 15 MINUTE
Run Code Online (Sandbox Code Playgroud)

这两个查询都假设每个用户只在联机表中出现一次(如果确实如此,则应添加UNIQUE约束来强制执行该操作).

如果用户名可以在表中出现多次,则只需在SELECT之后为第一个查询添加DISTINCT,但是第二个查询需要稍微不同的方法:

SELECT DISTINCT username
FROM online
WHERE time > NOW() - INTERVAL 60 MINUTE
AND NOT EXISTS
(
    SELECT *
    FROM online
    WHERE time > NOW() - INTERVAL 15 MINUTE
)
Run Code Online (Sandbox Code Playgroud)


OMG*_*ies 20

使用DATE_SUB从NOW()返回的DATETIME中减去时间:

最后15分钟

SELECT o.*
  FROM ONLINE o
 WHERE o.time >= DATE_SUB(NOW(), INTERVAL 15 MINUTE) 
Run Code Online (Sandbox Code Playgroud)

最后60分钟,但不是最后15分钟

SELECT o.*
  FROM ONLINE o
 WHERE o.time BETWEEN DATE_SUB(NOW(), INTERVAL 60 MINUTE) 
                  AND DATE_SUB(NOW(), INTERVAL 15 MINUTE) 
Run Code Online (Sandbox Code Playgroud)

重复处理成本.