如何编写SQL查询选取上周日晚8点及之后时间的所有数据行
问题背景
需要筛选表中日期字段值大于等于上周日晚8点的所有数据行,筛选规则要求:
- 若当前时间是周日晚7点,筛选结果包含近一整周的数据
- 若当前时间是周日晚9点,筛选结果仅包含周日晚8点之后约1小时的数据
原有查询语句不符合要求,因为它仅取当前时间往前推7天的同一时刻作为筛选起点,没有对齐周日晚8点的起止节点:
SELECT * FROM table WHERE date >= DATE_SUB(NOW(), INTERVAL 1 WEEK)
实现逻辑
核心是先算出距离当前时间最近的、已经过去的周日20:00作为统一筛选起点,计算规则适配MySQL日期函数特性:
- MySQL中
DAYOFWEEK()函数返回值为1代表周日、2代表周一、...、7代表周六 - 如果当天是周日且当前时间早于20点,说明本周日的20点还没到,筛选起点要取7天前的周日20点
- 其余情况,筛选起点取最近一个周日的20点即可
正确查询语句
SELECT * FROM your_table WHERE `date` >= ( SELECT CASE WHEN DAYOFWEEK(NOW()) = 1 AND HOUR(NOW()) < 20 THEN DATE_ADD(DATE_SUB(CURDATE(), INTERVAL 7 DAY), INTERVAL 20 HOUR) ELSE DATE_ADD( DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(NOW()) - 1) DAY), INTERVAL 20 HOUR ) END )
场景校验
- 当当前时间为周日19:00:命中第一分支,筛选起点为7天前的周日20:00,返回近一整周数据,符合预期
- 当当前时间为周日21:00:命中第二分支,筛选起点为当日20:00,仅返回当天20点之后的1小时左右数据,符合预期
- 当当前时间为周中任意一天(比如周三14:00):命中第二分支,筛选起点为刚过去的周日20:00,返回周日20点之后的所有数据,符合周度滚动对齐规则
内容的提问来源于stack exchange,提问作者XtevensChannel
相关产品推荐
相关产品推荐

