我的查询有点像这样:
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)
但不能继续这个:(
请帮忙!!!!
@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)
正如其他人所说,这只会排除周末,而不是假期.
不考虑假期,您可以使用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使用星期几来确定从基准日期添加或减去的天数.
| 归档时间: |
|
| 查看次数: |
34792 次 |
| 最近记录: |