如何编写PLSQL返回SYSDATE加上8个工作日?

时间:2018-08-02 03:13:09

标签: sql oracle plsql

如何编写PLSQL语句以返回SYSDATE加8个工作日? ComputerTIME + 8个工作日
“ ORACLE”数据库

例如:今天是2018年8月1日-> 8个工作日将是2018年8月13日

2 个答案:

答案 0 :(得分:1)

您是否需要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

SQL Fiddle Demo

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'))
  FROM t
 WHERE     TO_CHAR (dt, 'Dy') NOT IN ('Sat',
                                      'Sun',
                                      'NLS_DATE_LANGUAGE = American')
       AND dt > SYSDATE + 8

SQL Fiddle Demo

如果您的任务是使用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;

答案 1 :(得分:1)

您可以通过以下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;

SQL Fiddle Demo

P.S。

nls_date_language 的参数值及其各自的返回值(在我的情况下为 6 7 )可能会更改由于您的位置。