如何查询最近7天内指定星期(如周一)的新增数据库记录
需求实现方案
核心需同时满足2个过滤条件:
- 记录创建时间落在最近7天的时间区间内
- 记录创建当日为星期一
实现前置说明
不同数据库的日期函数、周几取值规则存在差异,需结合实际使用的数据库选择对应写法:
- 周几函数默认多数以周日为一周起始,部分可通过数据库参数调整,需确认取值基准后再做判断
- 时间范围需明确是「按当前时间点往前推7天的所有瞬时数据」,还是「按自然日统计的最近7天(含今日的0点至今)」,可根据业务调整边界值
各数据库具体SQL示例
MySQL / MariaDB
如果需要按当前时间点往前推7天的范围:
SELECT * FROM my_table WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY) -- DAYOFWEEK取值规则:周日=1,周一=2,周六=7 AND DAYOFWEEK(created_at) = 2;
如果需要按自然日的最近7天(即今日0点往前推7天的0点至今):
SELECT * FROM my_table WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND DAYOFWEEK(created_at) = 2;
PostgreSQL
SELECT * FROM my_table WHERE created_at >= NOW() - INTERVAL '7 days' -- EXTRACT(DOW FROM 时间)取值规则:周日=0,周一=1,周六=6 AND EXTRACT(DOW FROM created_at) = 1;
SQL Server
SELECT * FROM my_table WHERE created_at >= DATEADD(DAY, -7, GETDATE()) -- 兼容DATEFIRST配置的写法:默认配置下(DATEFIRST=7,周日为一周第一天)周一返回2,DATEFIRST=1(周一为一周第一天)时周一返回1 AND DATEPART(WEEKDAY, created_at) = CASE WHEN @@DATEFIRST = 7 THEN 2 ELSE 1 END;
也可以使用更稳妥的、不受周起始配置影响的写法,直接匹配星期名称:
SELECT * FROM my_table WHERE created_at >= DATEADD(DAY, -7, GETDATE()) -- 英文库用'Monday',中文库用'星期一' AND DATENAME(WEEKDAY, created_at) = N'星期一';
Oracle
SELECT * FROM my_table WHERE created_at >= SYSDATE - 7 -- 指定美式日期规则,避免受本地语言配置影响,周日=1,周一=2 AND TO_CHAR(created_at, 'D', 'NLS_DATE_LANGUAGE = AMERICAN') = '2';
性能优化建议
如果表数据量较大,建议为created_at字段建立普通索引,可快速过滤时间范围,避免全表扫描:
CREATE INDEX idx_my_table_created_at ON my_table(created_at);
注意:连续7天的时间区间若刚好覆盖2个星期一的时间段(例如当前时间为周一,往前推7天的区间会包含上周一、本周一的记录),将返回这两个日期下的所有符合条件的数据;如果业务仅需统计最近一个周一的记录,可根据实际需求调整时间范围的边界。
内容的提问来源于stack exchange,提问作者noor
相关产品推荐
相关产品推荐

