You need to enable JavaScript to run this app. 如何查询最近7天内指定星期(如周一)的新增数据库记录
优惠活动
大模型
产品
解决方案
定价
更多

如何查询最近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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 17:27:01