请求协助编写PL/SQL查询:提取指定日期前2个工作日数据(排除周末)
PL/SQL 查询实现:提取指定日期前2个工作日的数据
核心逻辑分析
根据需求,需针对指定日期Effective_date计算对应的两个前序工作日(仅周一至周五,排除周末),具体对应关系如下:
- 周一:上周四、上周五
- 周二:上周五、本周一
- 周三至周五:紧邻的前两个工作日(如周三对应周一、周二)
- 周六:本周四、本周五
- 周日:本周四、本周五
直接SQL查询方案
通过CASE语句结合日期偏移计算目标工作日,直接筛选数据(假设表名为your_table,日期列名为date_column,输入日期通过绑定变量:p_effective_date传入):
SELECT * FROM your_table WHERE date_column IN ( -- 计算较近的前序工作日 CASE TO_CHAR(:p_effective_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') WHEN 'MON' THEN :p_effective_date - 3 WHEN 'SUN' THEN :p_effective_date - 2 ELSE :p_effective_date - 1 END, -- 计算较远的前序工作日 CASE TO_CHAR(:p_effective_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') WHEN 'MON' THEN :p_effective_date - 4 WHEN 'TUE' THEN :p_effective_date - 4 WHEN 'SUN' THEN :p_effective_date - 3 ELSE :p_effective_date - 2 END );
可复用PL/SQL函数方案
如果需要重复调用该逻辑,可创建返回日期集合的函数:
CREATE OR REPLACE FUNCTION get_previous_two_workdays(p_effective_date DATE) RETURN SYS.ODCIDATELIST IS v_near_workday DATE; v_far_workday DATE; BEGIN -- 确定较近的前序工作日 CASE TO_CHAR(p_effective_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') WHEN 'MON' THEN v_near_workday := p_effective_date - 3; WHEN 'SUN' THEN v_near_workday := p_effective_date - 2; ELSE v_near_workday := p_effective_date - 1; END CASE; -- 确定较远的前序工作日 CASE TO_CHAR(p_effective_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') WHEN 'MON' THEN v_far_workday := p_effective_date - 4; WHEN 'TUE' THEN v_far_workday := p_effective_date - 4; WHEN 'SUN' THEN v_far_workday := p_effective_date - 3; ELSE v_far_workday := p_effective_date - 2; END CASE; RETURN SYS.ODCIDATELIST(v_near_workday, v_far_workday); END; /
调用函数查询数据:
SELECT t.* FROM your_table t JOIN TABLE(get_previous_two_workdays(:p_effective_date)) w ON t.date_column = w.column_value;
注意事项
NLS_DATE_LANGUAGE=ENGLISH用于统一星期缩写的判断标准,避免因数据库语言环境不同导致逻辑错误。- 当前逻辑仅排除周末,若需额外排除法定节假日,需扩展逻辑引入节假日表进行校验。
内容的提问来源于stack exchange,提问作者RAHUL SONI
相关产品推荐
相关产品推荐

