如何在SQL WHERE子句中实现工作日动态数据筛选逻辑?
解决方案
核心逻辑是根据当前日期的星期几分支设置WHERE条件:
- 当天是周一,筛选
RELATIVE_GLOBAL_DAY覆盖上周一至周五的范围 - 当天是周二至周日,保持原条件
RELATIVE_GLOBAL_DAY = -1
以下是主流数据库的实现代码:
MySQL
MySQL中WEEKDAY()返回值:周一为0,周日为6,用此函数实现逻辑:
WHERE CASE WEEKDAY(CURDATE()) WHEN 0 THEN tpd."RELATIVE_GLOBAL_DAY" BETWEEN -7 AND -3 -- 周一:上周一到周五对应-7至-3 ELSE tpd."RELATIVE_GLOBAL_DAY" = -1 -- 周二至周日:取昨日数据 END
PostgreSQL
PostgreSQL用extract(dow from current_date),返回值:周日为0,周一为1:
WHERE CASE extract(dow from current_date) WHEN 1 THEN tpd."RELATIVE_GLOBAL_DAY" BETWEEN -7 AND -3 -- 周一:上周一到周五对应-7至-3 ELSE tpd."RELATIVE_GLOBAL_DAY" = -1 -- 周二至周日:取昨日数据 END
SQL Server
SQL Server中DATEPART(weekday, GETDATE())常规设置下:周日为1,周一为2:
WHERE CASE DATEPART(weekday, GETDATE()) WHEN 2 THEN tpd."RELATIVE_GLOBAL_DAY" BETWEEN -7 AND -3 -- 周一:上周一到周五对应-7至-3 ELSE tpd."RELATIVE_GLOBAL_DAY" = -1 -- 周二至周日:取昨日数据 END
说明
- 范围
BETWEEN -7 AND -3的验证:假设今天是周一(RELATIVE_GLOBAL_DAY=0),上周五是往前推3天(-3),上周一往前推7天(-7),刚好覆盖上周一至周五的所有工作日数据。 - 若你的数据库星期函数返回规则不同,只需调整CASE语句中的判断值即可。
内容的提问来源于stack exchange,提问作者Virendra
相关产品推荐
相关产品推荐

