如何编写PLSQL以返回SYSDATE加上8个工作日?
如何编写PLSQL语句以返回SYSDATE加上8个工作日? 计算机时间+8个工作日 ORACLE数据库如何编写PLSQL以返回SYSDATE加上8个工作日?,sql,oracle,plsql,Sql,Oracle,Plsql,如何编写PLSQL语句以返回SYSDATE加上8个工作日? 计算机时间+8个工作日 ORACLE数据库 例如:今天是2018年8月1日->8个工作日将是2018年8月13日您需要使用PL/SQL吗?有了SQL查询,您就能够获得结果,那么为什么要使用PL/SQL呢?当使用SQL无法实现预期结果时,需要PL/SQL 尝试以下操作,根据您的要求进行必要的更改 WITH t AS ( SELECT SYSDATE + LEVEL AS dt FROM DUA
例如:今天是2018年8月1日->8个工作日将是2018年8月13日您需要使用PL/SQL吗?有了SQL查询,您就能够获得结果,那么为什么要使用PL/SQL呢?当使用SQL无法实现预期结果时,需要PL/SQL 尝试以下操作,根据您的要求进行必要的更改
WITH t
AS ( SELECT SYSDATE + LEVEL AS dt
FROM DUAL
CONNECT BY LEVEL <= 31)
SELECT (TO_CHAR (dt, 'DD-MON-YYYY fmDay', 'NLS_DATE_LANGUAGE = American'))
FROM t
WHERE TO_CHAR (dt, 'Dy') NOT IN ('Sat',
'Sun',
'NLS_DATE_LANGUAGE = American')
AND dt > SYSDATE + 8
或
如果您的任务是使用PL/SQL,请使用下面的命令获得所需的输出
DECLARE
v_dt VARCHAR2 (32);
BEGIN
WITH t
AS ( SELECT SYSDATE + LEVEL AS dt
FROM DUAL
CONNECT BY LEVEL <= 31)
SELECT MIN (
TO_CHAR (dt,
'DD-MON-YYYY fmDay',
'NLS_DATE_LANGUAGE = American'))
INTO v_dt
FROM t
WHERE TO_CHAR (dt, 'Dy') NOT IN ('Sat',
'Sun',
'NLS_DATE_LANGUAGE = American')
AND dt > SYSDATE + 8;
DBMS_OUTPUT.put_line (v_dt);
RETURN;
END;
您可以通过以下SQL SELECT语句直接完成下一个业务日期,即当前日期后的八天:
select trunc(sysdate) + rn as eight_next_business_day
from
(
select sum(dy) over (order by rn) sm, rn
from
(
select (case when to_char(sysdate+level-1,'D','nls_date_language=turkish') in (6,7)
then 0
else 1 end ) as dy,
row_number() over (order by level) as rn
from dual
connect by level <= 31
)
)
where sm = 8;
附言
nls_date_language参数的值,在我的例子中,其各自的返回值6和7可能会因您的位置而更改。为什么需要PL/SQL?8个工作日是否意味着不包括周六和周日?我有一个任务,需要返回SYSDATE->Correct not Saturday and Sundays->例如今天是2018年1月8日->8个工作日将是2018年13月8日。公共假日如何?TO_CHAR dt的结果,“Dy”取决于当前用户会话NLS_date_语言,所以你的解决方案可能不起作用。user75ponic…问题。。您已选择MIN。。。。从t…为什么叫它t?@JLSG从日期列表中获取最短日期或第一个日期。@JLSG希望我已经讲清楚了,否则请告诉我。
select trunc(sysdate) + rn as eight_next_business_day
from
(
select sum(dy) over (order by rn) sm, rn
from
(
select (case when to_char(sysdate+level-1,'D','nls_date_language=turkish') in (6,7)
then 0
else 1 end ) as dy,
row_number() over (order by level) as rn
from dual
connect by level <= 31
)
)
where sm = 8;