You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何查询表中两个指定星期几之间的日期数据

解决星期几范围查询的问题

嘿,我懂你遇到的麻烦了——用BETWEEN来筛选星期几的记录根本行不通,因为它是按字符串的字典顺序来判断范围,完全不是我们日常认知的星期循环顺序。比如你查BETWEEN 'FRIDAY' AND 'MONDAY',字典里F在M前面,所以只会返回那些DayName字符串介于F和M之间的记录——也就是FRIDAYMONDAY,直接漏掉了周六(SATURDAY)和周日(SUNDAY),因为它们的首字母S在M之后,不在这个区间里。

正确的解决方案:用数字映射星期几

要解决这个问题,我们需要把每个星期几映射成一个数字,然后通过数字的范围来判断,这样就能正确处理跨周末的情况(比如周五到周一)。

步骤1:给星期几分配数字

我们可以按周一到周日的顺序分配:

  • MONDAY → 1
  • TUESDAY → 2
  • WEDNESDAY → 3
  • THURSDAY → 4
  • FRIDAY → 5
  • SATURDAY → 6
  • SUNDAY → 7

步骤2:编写通用的查询语句

我们需要分两种情况处理:

  1. 起始星期在结束星期之前(比如周二到周四):直接用数字的BETWEEN范围
  2. 起始星期在结束星期之后(比如周五到周一):需要分成两部分——起始到周日,加上周一到结束

下面是可以直接使用的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

火山引擎 最新活动