需要在oracle中找到下一个和上一个工作日

use*_*906 2 oracle weekday

我的查询有点像这样:

select 1 from dual where :p1_task_date in (sysdate,sysdate+1,sysdate-1) and :p1_task_id is not null
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我希望得到下一个/上一个工作日(下一个/上周工作日)而不是sysdate + 1和sysdate-1.我尝试过类似的东西:

select next_day(sysdate, to_char(sysdate+1,'DAY')) from dual`
Run Code Online (Sandbox Code Playgroud)

但不能继续这个:(

请帮忙!!!!

All*_*lan 8

@Tawman的答案会有效,但我更喜欢这种方法的可读性:

select sysdate as current_date,
       case when to_char(sysdate,'D') in (1,6,7)
            then next_day(sysdate,'Monday')
            else sysdate+1 end as next_weekday,
       case when to_char(sysdate,'D') in (1,2,7)
            then next_day(sysdate-7,'Friday')
            else sysdate-1 end as prev_weekday
from dual
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,这只会排除周末,而不是假期.


taw*_*man 5

不考虑假期,您可以使用DECODE函数使用星期几来执行一些简单的日期数学运算:

SELECT SYSDATE-DECODE(TO_CHAR(SYSDATE, 'D'), 2, 3, 1, 2, 1) AS WORK_DATE_BEFORE,
        TO_CHAR(SYSDATE-DECODE(TO_CHAR(SYSDATE, 'D'), 2, 3, 1, 2, 1), 'DAY') AS WORK_DAY_BEFORE,
        SYSDATE AS BASE_DATE,
        TO_CHAR(SYSDATE, 'DAY') AS BASE_DAY,
        SYSDATE+DECODE(TO_CHAR(SYSDATE, 'D'), 6, 3, 7, 2, 1) AS WORK_DATE_AFTER,
        TO_CHAR(SYSDATE+DECODE(TO_CHAR(SYSDATE, 'D'), 6, 3, 7, 2, 1), 'DAY') AS WORK_DAY_AFTER
FROM DUAL
Run Code Online (Sandbox Code Playgroud)

只需用包含要检查的日期的变量替换SYSDATE即可.DECODE使用星期几来确定从基准日期添加或减去的天数.