我有一个包含下一列的表:
ip(varchar 255), index(bigint 20), time(timestamp)
每次在那里插入东西时,时间列都会获取当前时间戳。我想运行一个查询,返回过去 24 小时内添加的所有行。这是我尝试执行的:
SELECT ip, index FROM users WHERE ip = 'some ip' AND TIMESTAMPDIFF(HOURS,time,NOW()) < 24
它不起作用。
我有一个包含下一列的表:
ip(varchar 255), index(bigint 20), time(timestamp)
每次在那里插入东西时,时间列都会获取当前时间戳。我想运行一个查询,返回过去 24 小时内添加的所有行。这是我尝试执行的:
SELECT ip, index FROM users WHERE ip = 'some ip' AND TIMESTAMPDIFF(HOURS,time,NOW()) < 24
它不起作用。
HOURS 应该是 HOUR。请参阅TIMESTAMPADD的文档以查看参数的有效值unit
:
TIMESTAMPADD(单位,间隔,日期时间_expr)
将整数表达式间隔添加到日期或日期时间表达式 datetime_expr。间隔的单位由 unit 参数给出,它应该是以下值之一: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
使用mysql的日期时间函数
SELECT something FROM tbl_name
WHERE DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= time;
你可能想考虑反过来做。与其从每次减去 24 小时,不如计算 24 小时前(一次)的时间,然后对照它检查您的时间值。很可能更优化,虽然我对 mySql 不太熟悉
SELECT ip, index FROM users WHERE ip = 'some ip' AND time > DATE_SUB(NOW(), HOUR, 24)
SELECT ip, index
FROM users
WHERE ip = 'some ip'
AND time >= NOW() - INTERVAL 24 HOUR
这假设您的表中没有“未来”时间。如果有,请将其附加到您的 where 子句中:
AND time <= NOW()
来自http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff
TIMESTAMPADD(单位,间隔,日期时间_expr)
将整数表达式间隔添加到日期或日期时间表达式 datetime_expr。间隔的单位由 unit 参数给出,它应该是以下值之一:FRAC_SECOND(微秒)、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER 或 YEAR。
从 MySQL 5.1.24 开始,可以使用 MICROSECOND 代替 FRAC_SECOND 与此功能,并且不推荐使用 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(WEEK,1,'2003-01-02');
-> '2003-01-09'
所以 ...
SELECT TIMESTAMPADD(DAY,-1,CURRENT_TIMESTAMP());
应该是你想要的