Oracle/PLSQL:查询上周周五至再上一周周五日期的代码修正求助
问题分析与修正方案
你的原查询逻辑踩了一个典型的坑:你用每行的Dates字段来计算截断日期,而不是基于当前日期固定筛选范围。TRUNC(Dates,'d')会对每一行的日期单独截断到它所在周的周日(Oracle中TRUNC(date,'d')默认以周日作为一周起始),这导致每个行的筛选边界都不一样,完全偏离了你“筛选上周周五至再上一周周五之间日期”的需求。
修正后的查询语句
我们需要基于当前日期(SYSDATE)来计算固定的日期边界,才能精准筛选目标范围:
SELECT Dates FROM tablename WHERE Dates BETWEEN TRUNC(SYSDATE, 'd') - 9 AND TRUNC(SYSDATE, 'd') - 2;
逻辑拆解
TRUNC(SYSDATE, 'd'):获取当前日期所在周的周日(比如今天是2024-05-20周一,这个结果就是2024-05-19周日)TRUNC(SYSDATE, 'd') - 2:上周的周五(周日往前推2天)TRUNC(SYSDATE, 'd') - 9:再上一周的周五(上周周五往前推7天,等同于周日往前推9天)- 如果不想包含边界日期,可以把
BETWEEN换成范围判断:Dates > TRUNC(SYSDATE, 'd') - 9 AND Dates < TRUNC(SYSDATE, 'd') - 2
额外适配说明
- 如果你的业务场景中一周以周一为起始(比如部分欧洲地区),需要调整
TRUNC的参数为ISO周('iw'),此时对应的查询语句为:
这里的逻辑是:SELECT Dates FROM tablename WHERE Dates BETWEEN TRUNC(SYSDATE, 'iw') - 10 AND TRUNC(SYSDATE, 'iw') - 3;TRUNC(SYSDATE, 'iw')得到当前周的周一,加4天是当前周周五,减7天就是上周周五,再减7天就是再上一周周五。 - 确保
Dates字段是DATE类型,如果是字符串存储,必须先用TO_DATE(Dates, 'DD/MM/YYYY')转换为日期类型,否则会出现隐式转换导致的错误或性能问题。
内容的提问来源于stack exchange,提问作者Lokhi
相关产品推荐
相关产品推荐

