MySQL查询:筛选对应指定星期几的递增日期数值行
解决MySQL中筛选对应星期几数值的问题
没问题,这个需求可以通过MySQL的取模运算轻松实现,核心是把持续递增的数值映射回1-7的星期几范围。
核心思路
你的数值规则是:1=周一,7=周日,超过一周的数值(比如13、20)按7循环对应星期几。这里唯一需要注意的是7的倍数(如7、14、21),直接用MOD取模会得到0,但我们需要对应7(周日)。
可以用一个通用表达式把任何数值转换为对应的星期几:MOD(week_num - 1, 7) + 1
这个表达式的逻辑是:
- 先把数值减1,让周日(7)变成6,这样取模7后得到6,再加1就回到7,完美匹配周日
- 其他数值(比如13)减1后是12,取模7得5,加1得6,正好对应周六
举几个验证例子:
- 数值1 →
(1-1)=0 → MOD(0,7)=0 → +1=1(周一,正确) - 数值7 →
(7-1)=6 → MOD(6,7)=6 → +1=7(周日,正确) - 数值13 →
(13-1)=12 → MOD(12,7)=5 → +1=6(周六,正确) - 数值20 →
(20-1)=19 → MOD(19,7)=5 → +1=6(周六,正确)
具体查询语句
假设你的表名为your_table,存储星期数值的列名为week_value,要筛选的目标星期几为target_day(比如1=周一,7=周日),查询语句如下:
SELECT * FROM your_table WHERE MOD(week_value - 1, 7) + 1 = [target_day];
示例:筛选所有周六的记录
SELECT * FROM your_table WHERE MOD(week_value - 1, 7) + 1 = 6;
备选方案(分情况处理)
如果你觉得统一表达式有点绕,也可以分目标星期几处理:
- 筛选周日(7):
SELECT * FROM your_table WHERE MOD(week_value, 7) = 0;
- 筛选周一(1)到周六(6):
-- 筛选周一 SELECT * FROM your_table WHERE MOD(week_value, 7) = 1; -- 筛选周六 SELECT * FROM your_table WHERE MOD(week_value, 7) = 6;
额外提示
如果你的目标星期几是动态参数(比如从应用程序传入),推荐使用统一表达式的写法,这样不用在代码里做条件判断,逻辑更简洁。
内容的提问来源于stack exchange,提问作者Gleeson88
相关产品推荐
相关产品推荐

