在mysql中查询近一周的数据,核心思路是利用日期函数计算出七天前的时间点,然后在where条件中过滤时间字段。下面介绍几种常见且实用的写法。

使用date_sub函数查询
date_sub可以把当前日期往前推指定天数,配合curdate或者now就能拿到近一周的范围。假设表中有一个created_at字段记录数据插入时间,可以这样写:
-- 查询 created_at 在最近7天内的数据(包含今天) SELECT * FROM orders WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
如果希望精确到时分秒,用now代替curdate即可:
SELECT * FROM orders WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);
使用between写法
也可以显式写出开始和结束边界,逻辑更直观:
SELECT * FROM orders WHERE created_at BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW();
按天分组统计近一周数据
如果需要看最近七天每天的量,可以用date函数归并后再分组:
SELECT DATE(created_at) AS day, COUNT(*) AS cnt FROM orders WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY DATE(created_at) ORDER BY day;
关于索引和性能的注意点
在大数据表上查时间区间,最好给时间字段建索引。需要避免对字段使用函数包裹,例如下面这种写法会导致索引失效:
-- 不推荐:对字段用函数,索引用不上 SELECT * FROM orders WHERE DATE_SUB(created_at, INTERVAL 7 DAY) >= CURDATE();
应当把函数用在常量侧,也就是前面示例中的写法,让mysql能走created_at上的索引。
处理时区问题
如果数据库时间和业务时区不一致,可以用convert_tz先做转换再比较,或者统一在应用层处理好时间再传参。用参数化查询时,直接把计算好的一周前时间传给mysql也更安全:
-- 假设从程序传入了开始时间 :start_time 和结束时间 :end_time SELECT * FROM orders WHERE created_at >= :start_time AND created_at < :end_time;
掌握这些写法后,mysql查询近一周的数据就是一件很简单的事,按业务需要选合适的sql即可。