如何查询表中两个指定星期几之间的日期数据
解决星期几范围查询的问题
嘿,我懂你遇到的麻烦了——用BETWEEN来筛选星期几的记录根本行不通,因为它是按字符串的字典顺序来判断范围,完全不是我们日常认知的星期循环顺序。比如你查BETWEEN 'FRIDAY' AND 'MONDAY',字典里F在M前面,所以只会返回那些DayName字符串介于F和M之间的记录——也就是FRIDAY和MONDAY,直接漏掉了周六(SATURDAY)和周日(SUNDAY),因为它们的首字母S在M之后,不在这个区间里。
正确的解决方案:用数字映射星期几
要解决这个问题,我们需要把每个星期几映射成一个数字,然后通过数字的范围来判断,这样就能正确处理跨周末的情况(比如周五到周一)。
步骤1:给星期几分配数字
我们可以按周一到周日的顺序分配:
- MONDAY → 1
- TUESDAY → 2
- WEDNESDAY → 3
- THURSDAY → 4
- FRIDAY → 5
- SATURDAY → 6
- SUNDAY → 7
步骤2:编写通用的查询语句
我们需要分两种情况处理:
- 起始星期在结束星期之前(比如周二到周四):直接用数字的
BETWEEN范围 - 起始星期在结束星期之后(比如周五到周一):需要分成两部分——起始到周日,加上周一到结束
下面是可以直接使用的SQL代码,你可以根据输入的星期几替换对应的数字:
示例1:查询周五(5)到周一(1)的记录
SELECT EMPLID, DUR, DayName, TRC FROM DayTable WHERE -- 转换星期名为数字 CASE DayName WHEN 'MONDAY' THEN 1 WHEN 'TUESDAY' THEN 2 WHEN 'WEDNESDAY' THEN 3 WHEN 'THURSDAY' THEN 4 WHEN 'FRIDAY' THEN 5 WHEN 'SATURDAY' THEN 6 WHEN 'SUNDAY' THEN 7 END IN (5,6,7,1) -- 直接列出需要的数字,或者用OR条件 ORDER BY DUR ASC;
或者更灵活的动态写法:
-- 定义起始和结束星期的数字 SET @start_num = 5; -- FRIDAY SET @end_num = 1; -- MONDAY SELECT EMPLID, DUR, DayName, TRC FROM DayTable WHERE CASE -- 如果起始<=结束,直接判断区间 WHEN @start_num <= @end_num THEN CASE DayName WHEN 'MONDAY' THEN 1 WHEN 'TUESDAY' THEN 2 WHEN 'WEDNESDAY' THEN 3 WHEN 'THURSDAY' THEN 4 WHEN 'FRIDAY' THEN 5 WHEN 'SATURDAY' THEN 6 WHEN 'SUNDAY' THEN 7 END BETWEEN @start_num AND @end_num -- 如果起始>结束,分两部分判断 ELSE CASE DayName WHEN 'MONDAY' THEN 1 WHEN 'TUESDAY' THEN 2 WHEN 'WEDNESDAY' THEN 3 WHEN 'THURSDAY' THEN 4 WHEN 'FRIDAY' THEN 5 WHEN 'SATURDAY' THEN 6 WHEN 'SUNDAY' THEN 7 END BETWEEN @start_num AND 7 OR CASE DayName WHEN 'MONDAY' THEN 1 WHEN 'TUESDAY' THEN 2 WHEN 'WEDNESDAY' THEN 3 WHEN 'THURSDAY' THEN 4 WHEN 'FRIDAY' THEN 5 WHEN 'SATURDAY' THEN 6 WHEN 'SUNDAY' THEN 7 END BETWEEN 1 AND @end_num END ORDER BY DUR ASC;
示例2:查询周二(2)到周四(4)的记录
这种情况更简单,直接用BETWEEN即可:
SELECT EMPLID, DUR, DayName, TRC FROM DayTable WHERE CASE DayName WHEN 'MONDAY' THEN 1 WHEN 'TUESDAY' THEN 2 WHEN 'WEDNESDAY' THEN 3 WHEN 'THURSDAY' THEN 4 WHEN 'FRIDAY' THEN 5 WHEN 'SATURDAY' THEN 6 WHEN 'SUNDAY' THEN 7 END BETWEEN 2 AND 4 ORDER BY DUR ASC;
优化建议
如果你的业务经常需要按星期几范围查询,建议在DayTable表中新增一个DayNumber字段,直接存储每个星期几对应的数字(1-7)。这样每次查询就不用重复写CASE语句,不仅代码更简洁,查询效率也会更高。
内容的提问来源于stack exchange,提问作者Arun D




