2010-05-17 102 views
2

我有一个包含下一列的表:每个东西插入有时间帮助MySQL查询

ip(varchar 255), index(bigint 20), time(timestamp) 

,时间列得到当前时间戳。 我想运行一个查询,返回在过去24小时内添加的所有行。 这是我尝试执行:

SELECT ip, index FROM users WHERE ip = 'some ip' AND TIMESTAMPDIFF(HOURS,time,NOW()) < 24 

而且这是行不通的。 有人可以帮我吗? 谢谢:)

+2

根据mysql手册,单位应该是HOUR而不是HOURS。 http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timestampadd – mdma 2010-05-17 12:05:07

+1

@MDMA - 我想你有答案,肯定是HOUR(单数) – amelvin 2010-05-17 12:10:22

回答

4

小时应该是小时。看到documentantion为TIMESTAMPADD看到unit参数的有效值:

TIMESTAMPADD(单元,间隔,datetime_expr)

添加整数表达式间隔的日期或日期时间表达datetime_expr。间隔的单位由单位参数给出,它应该是以下值之一:FRAC_SECOND(微秒),SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER或YEAR。

所以您的查询应该是:

SELECT ip, index 
FROM users 
WHERE ip = 'some ip' 
AND TIMESTAMPDIFF(HOUR, time, NOW()) < 24 

还请注意,此查询将不能够采取指数的优势时间,如果存在的话。这可能是更有效的重写查询如下:

SELECT ip, index 
FROM users 
WHERE ip = 'some ip' 
AND time > NOW() - interval 1 day 
+0

+1有时阅读这个问题(仔细)有帮助! – amelvin 2010-05-17 12:11:58

1

MySQL的

SELECT something FROM tbl_name 
    WHERE DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= time; 
+0

我的猜测是,这将实际上使用'时间'索引,而比较timestampdiff(xxx,curdate(),时间)与常量不会,我是否正确? – araqnid 2010-05-17 12:11:27

+0

@araqnid:是的,如果一个索引存在,这个查询就可以使用它。这适用于这个答案,我的第二个建议,Salman A的答案和Paul G's。 – 2010-05-17 12:16:45

0

使用date time functionshttp://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff

TIMESTAMPADD(单元,间隔,datetime_expr)

将整数表达式间隔 添加到日期或日期时间表达式 datetime_expr。间隔 的单位由单位参数给出,其中 应该是以下值之一: FRAC_SECOND(微秒),SECOND, MINUTE,HOUR,DAY,WEEK,MONTH, QUARTER或YEAR。

与MySQL 5.1.24开始,这是 可能在FRAC_SECOND的地方 使用MICROSECOND使用此功能,并 FRAC_SECOND已被弃用。在MySQL 5.5中删除FRAC_SECOND 。

单位值可以使用如所示的关键字 一个,或者与SQL_TSI_的 前缀来指定。例如,DAY 和SQL_TSI_DAY都是合法的。

mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');

- > '2003-01-02 00:01:00'

的MySQL> SELECT TIMESTAMPADD(周,1, '2003-01-02');

- > '2003年1月9日'

所以......

SELECT TIMESTAMPADD(DAY,-1,CURRENT_TIMESTAMP()); 

应该是你想要什么

1

你可能要考虑轮做它的其他方式。而不是每次减去24小时,计算24小时前(一次)的时间,然后检查你的时间值。很可能更理想,虽然我不是太熟悉的MySQL

SELECT ip, index FROM users WHERE ip = 'some ip' AND time > DATE_SUB(NOW(), HOUR, 24) 
1
SELECT ip, index 
FROM users 
WHERE ip = 'some ip' 
AND time >= NOW() - INTERVAL 24 HOUR 

这里假设你没有在表中的“未来”的时间。如果有,附加到你的where子句中:

AND time <= NOW()