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中减去时间:
SELECT o.*
FROM ONLINE o
WHERE o.time >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)
Run Code Online (Sandbox Code Playgroud)
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)
重复处理成本.
归档时间: |
|
查看次数: |
63702 次 |
最近记录: |