如何从MySQL的articles表获取最近7天数据?查询语句故障求助
解决获取最近7天Unix时间戳记录的SQL问题
嘿,你的问题根源在于数据类型不匹配:timestmp字段是用time()生成的Unix秒级时间戳(整数类型),而NOW()返回的是MySQL的datetime类型,直接把这两种类型做减法比较,MySQL的隐式转换不会按照你预期的方式工作,所以语句无法正确执行。
这里给你两种可行的解决方案,优先推荐第一种(更高效):
方案1:将时间区间转换为Unix时间戳(推荐)
使用UNIX_TIMESTAMP()函数把NOW() - INTERVAL 7 DAY转换成和timestmp同类型的秒级时间戳,这样就能正确比较了:
SELECT COUNT(*) FROM `articles` WHERE `timestmp` > UNIX_TIMESTAMP(NOW() - INTERVAL 7 DAY);
如果你习惯用168小时来表示7天,也可以这么写:
SELECT COUNT(*) FROM `articles` WHERE `timestmp` > UNIX_TIMESTAMP(NOW() - INTERVAL 168 HOUR);
这种方法的优势是:只转换右侧的常量值,不会影响timestmp字段的索引使用,查询效率更高。
方案2:将Unix时间戳转换为datetime(不推荐,可能影响索引)
如果你一定要用datetime类型比较,可以用FROM_UNIXTIME()把timestmp转换成datetime,但这样会导致timestmp上的索引失效(如果有索引的话),查询速度会变慢:
SELECT COUNT(*) FROM `articles` WHERE FROM_UNIXTIME(`timestmp`) > NOW() - INTERVAL 7 DAY;
额外说明
time()函数生成的是秒级的Unix时间戳,而MySQL的UNIX_TIMESTAMP()默认返回的也是秒级结果,两者完全匹配,所以方案1能精准筛选出最近7天的记录。
内容的提问来源于stack exchange,提问作者Mr. Tom
相关产品推荐
相关产品推荐

