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

时间:2011-01-29 16:58:40

标签: sql mysql 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)
);

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

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

2 个答案:

答案 0 :(得分:71)

第一次查询:

SELECT username
FROM online
WHERE time > NOW() - INTERVAL 15 MINUTE

对于你的第二个:

SELECT username
FROM online
WHERE time BETWEEN NOW() - INTERVAL 60 MINUTE AND NOW() - INTERVAL 15 MINUTE

这两个查询都假设每个用户只在联机表中出现一次(如果确实如此,则应添加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
)

答案 1 :(得分:18)

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

最后15分钟

SELECT o.*
  FROM ONLINE o
 WHERE o.time >= DATE_SUB(NOW(), INTERVAL 15 MINUTE) 

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

SELECT o.*
  FROM ONLINE o
 WHERE o.time BETWEEN DATE_SUB(NOW(), INTERVAL 60 MINUTE) 
                  AND DATE_SUB(NOW(), INTERVAL 15 MINUTE) 

额外重复处理成本。