代码之家  ›  专栏  ›  技术社区  ›  Michael S.

MySQL查询帮助

  •  2
  • Michael S.  · 技术社区  · 16 年前

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

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

    每次在其中插入内容时,时间列都会得到当前时间戳。 我想运行一个查询,返回在过去24小时内添加的所有行。 这是我要执行的操作:

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

    但它不起作用。 有人能帮我吗? 谢谢)

    5 回复  |  直到 16 年前
        1
  •  4
  •   Mark Byers    16 年前

    小时应为小时。参见文档 TIMESTAMPADD 查看的有效值 unit 参数:

    时间戳添加(单位、间隔、日期时间表达式)

    将整数表达式间隔添加到日期或日期时间表达式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
    
        2
  •  1
  •   Salil    16 年前

    使用 date time functions MySQL的

    SELECT something FROM tbl_name
        WHERE DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= time;
    
        3
  •  1
  •   PaulG    16 年前

    你可以考虑换个角度来做。不要每次减去24小时,而是计算24小时前的时间(一次),然后检查时间值。很可能更优化,不过我不太熟悉MySQL

    SELECT ip, index FROM users WHERE ip = 'some ip' AND time > DATE_SUB(NOW(), HOUR, 24)
    
        4
  •  1
  •   Salman Arshad    16 年前
    SELECT ip, index
    FROM users
    WHERE ip = 'some ip'
    AND time >= NOW() - INTERVAL 24 HOUR
    

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

    AND time <= NOW()
    
        5
  •  0
  •   amelvin    16 年前

    从 http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff

    时间戳添加(单位、间隔、日期时间表达式)

    添加整数表达式间隔 到日期或日期时间表达式 DATETMEMEXEPR。间隔时间单位 由Unit参数给出,其中 应为以下值之一: 分秒(微秒),秒, 分钟,小时,天,周,月, 季度或年度。

    从MySQL5.1.24开始, 可就地使用微秒 第二个函数,以及 不推荐使用frac_second。二次压裂 在mysql 5.5中删除。

    单位值可使用 关键字之一,如图所示,或带有 SQL的前缀。例如,day 而SQL TSI日都是合法的。

    mysql>选择时间戳添加(分钟,1,'2003-01-02');

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

    mysql>选择时间戳添加(week,1,'2003-01-02');

    ->'2003-01-09'

    所以…

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

    应该是你想要的