2

我有一个包含下一列的表:

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

每次在那里插入东西时,时间列都会获取当前时间戳。我想运行一个查询,返回过去 24 小时内添加的所有行。这是我尝试执行的:

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

它不起作用。

4

5 回答 5

4

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
于 2010-05-17T12:03:02.890 回答
1

使用mysql的日期时间函数

SELECT something FROM tbl_name
    WHERE DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= time;
于 2010-05-17T12:04:42.287 回答
1

你可能想考虑反过来做。与其从每次减去 24 小时,不如计算 24 小时前(一次)的时间,然后对照它检查您的时间值。很可能更优化,虽然我对 mySql 不太熟悉

SELECT ip, index FROM users WHERE ip = 'some ip' AND time > DATE_SUB(NOW(), HOUR, 24)
于 2010-05-17T12:09:58.630 回答
1
SELECT ip, index
FROM users
WHERE ip = 'some ip'
AND time >= NOW() - INTERVAL 24 HOUR

这假设您的表中没有“未来”时间。如果有,请将其附加到您的 where 子句中:

AND time <= NOW()
于 2010-05-17T12:10:30.343 回答
0

来自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());

应该是你想要的

于 2010-05-17T12:07:02.400 回答