【发布时间】:2020-05-30 01:44:55
【问题描述】:
目前我有一个进程,它接受一个日期变量 EG:'01-MAR-2026',然后它会遍历这个日期,检查当天是否是星期三。如果是这样,则增加一个计数器,否则添加 1 天并再次检查。 当星期三计数 = 3 时退出。
IF (to_char(v_Date,'dy') = 'wed') THEN
v_NumWed := v_NumWed + 1;
END IF;
WHILE (v_NumWed != 3) LOOP
v_Date := v_Date + interval '1' day;
IF (to_char(v_Date, 'dy') = 'wed') THEN
v_NumWed := v_NumWed + 1;
END IF;
END LOOP;
但是我觉得有一种更简单的方法可以通过查询或不使用循环 EG 的方式来实现这一点:使用输入日期和查询来查找第一个星期三然后 + 14 天?
任何建议都会很棒,在此先感谢:)
编辑:我有类似的东西似乎可以工作,还考虑第一天是否是星期三本身。
select next_day(trunc(v_date, 'MM') - 1, 'WED'), next_day(trunc(v_date, 'MM') - 1, 'WED') + 14 into v_first, v_third from dual;
已解决:感谢大家的帮助,现在在 cmets 中找到了一些可能的解决方案!
【问题讨论】:
-
所以对于 2026-03-01,您期望结果为 2026-03-18,对吗?如果原始日期本身是星期三怎么办 - 2026-03-04 是否也应该映射到 2026-03-18 或 2026-03-25?
-
Alex - 很好的测试用例,我认为底部的编辑代码涵盖了它。 01-APR-20 是星期三,进入 v_first。 15 号是第三个星期三,进入 v_third。本质上不是优雅的外观,但它可以工作