Oracle基于sysdate星期返回YYYYMMDD格式起止日期的PL/SQL实现
PL/SQL 函数实现按周规则返回格式化日期
核心逻辑梳理
你给出的规则可以简化为通用逻辑,无需按周几单独分支判断:
- start_date 固定为上一个周六的日期
- end_date 固定为当前系统日期的前一天
该逻辑完全覆盖你提到的所有规则:- 周日时前一天是周六,两个值自然相等,匹配规则1
- 周一时前一天是周日,匹配规则2
- 周二时前一天是周一,匹配规则3,后续周几以此类推
函数实现
为了避免数据库NLS语言设置导致的日期计算异常,以下提供兼容多语言环境的实现版本:
-- 先定义存储返回结果的自定义类型 CREATE OR REPLACE TYPE rule_date_range AS OBJECT ( start_date VARCHAR2(8), end_date VARCHAR2(8) ); / -- 核心计算函数 CREATE OR REPLACE FUNCTION get_rule_date RETURN rule_date_range IS v_week_num NUMBER; v_last_sat DATE; v_prev_day DATE; v_res rule_date_range; BEGIN -- 固定美式周历规则计算周几,避免NLS影响:1=周日,2=周一...7=周六 v_week_num := TO_CHAR(TRUNC(SYSDATE), 'D', 'NLS_DATE_LANGUAGE = AMERICAN'); -- 计算上一个周六 IF v_week_num = 7 THEN -- 当前为周六,上一个周六为7天前 v_last_sat := TRUNC(SYSDATE) - 7; ELSE v_last_sat := TRUNC(SYSDATE) - v_week_num; END IF; -- 计算前一天作为end_date v_prev_day := TRUNC(SYSDATE) - 1; -- 转为YYYYMMDD格式返回 v_res := rule_date_range( TO_CHAR(v_last_sat, 'YYYYMMDD'), TO_CHAR(v_prev_day, 'YYYYMMDD') ); RETURN v_res; END; /
使用示例
DECLARE v_result rule_date_range; BEGIN v_result := get_rule_date; DBMS_OUTPUT.PUT_LINE('拉数起始日期:'||v_result.start_date); DBMS_OUTPUT.PUT_LINE('拉数结束日期:'||v_result.end_date); END; /
场景验证
我们用实际日期测试匹配度:
- 系统日期为2024-05-19(周日):返回
start_date=20240518,end_date=20240518,符合规则 - 系统日期为2024-05-20(周一):返回
start_date=20240518,end_date=20240519,符合规则 - 系统日期为2024-05-21(周二):返回
start_date=20240518,end_date=20240520,符合规则 - 系统日期为2024-05-24(周五):返回
start_date=20240518,end_date=20240523,符合递推规则
内容的提问来源于stack exchange,提问作者pranav singh
相关产品推荐
相关产品推荐

