簡體   English   中英

在oracle中計算兩個日期之間的工作日

[英]Calculating the working days between two dates in oracle

以下是我嘗試計算兩個日期之間的工作日數的函數。

CREATE OR REPLACE function workingdays 
( start_date IN DATE , end_date IN DATE)

return  number

as

total_days varchar2(10);

v_count integer:= 0;

end_value date := to_date(end_date , 'YYYY-MM-DD');

start_value date := to_date(start_date , 'YYYY-MM-DD');

date_diff number(10);


begin

while(start_value <= end_value)

loop

        if (to_char(TO_DATE(start_value,'YYYY-MM-DD') , 'D') = 1 or to_char(TO_DATE(start_value,'YYYY-MM-DD'), 'D') = 7)
        then v_count := v_count+1;
        end if;

start_value := start_value + 1;

end loop;

date_diff :=to_number( to_date( end_date, 'YYYY-MM-DD') - to_date (start_date , 'YYYY-MM-DD')) ;

total_days := to_char( (to_number(date_diff) - to_number(v_count)) + 1);


return (' The total working days is' || to_number((total_days)));


end;
/

該函數編譯成功,但是在執行該函數時,我在返回行收到一條錯誤消息。 有人可以指導我。 數字/字符轉換是一個問題。

您進行了許多無用的轉換,幾乎所有轉換都可以跳過。

TO_CHAR(..., 'D')取決於當前用戶的NLS_TERRITORY值,因此除非確保某個NLS_TERRITORY設置,否則不應該使用它。

這個正在工作:

CREATE OR REPLACE FUNCTION workingdays(start_date IN DATE , end_date IN DATE) RETURN VARCHAR2 AS

    total_days NUMBER;
    v_count INTEGER:= 0;
    end_value DATE := TRUNC(end_date);
    start_value DATE := TRUNC(start_date);
    date_diff NUMBER;

BEGIN

    WHILE start_value <= end_value LOOP
        IF TO_CHAR(start_value, 'fmDay', 'NLS_DATE_LANGUAGE = american') IN ('Saturday','Sunday') THEN 
            v_count := v_count + 1;
      END IF;
      start_value := start_value + 1;
    END LOOP;
    date_diff := end_value - TRUNC(start_date);
    total_days := date_diff - v_count + 1;

    RETURN ' The total working days is ' || total_days;

END;
/

還有許多其他可能性,這只是另一種實現方式:

CREATE OR REPLACE FUNCTION workingdays(start_date IN DATE, end_date IN DATE) RETURN VARCHAR2 AS
    next_run_date DATE := TRUNC(start_date);
    total_days INTEGER := 0;
BEGIN
    LOOP
        DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('FREQ=DAILY;INTERVAL=1;BYDAY=MON,TUE,WED,THU,FRI', NULL, next_run_date, next_run_date);
        EXIT WHEN next_run_date >= end_date;
        total_days := total_days + 1;
    END LOOP;
    RETURN ' The total working days is ' || total_days;
END;
select min(a_day)
       as from_date
      ,max(a_day)
       as till_date
      ,sum(decode(to_char(a_day,'D')
                 ,1,0
                 ,7,0
                 ,1
                 )
          )
       as wrk_days_count   
from (select trunc(sysdate,'iw') + level - 1
             as a_day
      from dual
      connect by level < 8)
;      

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM