熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

查出任一年月所含的工作日

2013-11-12 23:40:03  來源: Oracle 

  CREATE OR REPLACE FUNCTION Get_WorkingDays(
  ny IN VARCHAR
  ) RETURN INTEGER IS
  /*
  
  函數名稱Get_WorkingDays
  
  中文名稱求某一年月中共有多少工作日
  
  作者姓名: XINGPING
  
  編寫時間:
  
  輸入參數NY:所求包含工作日數的年月格式為yyyymm
  
  返 回 值整型值包含的工作日數目
  
  算法描述
  
  )列舉出參數給出的年月中的每一天這裡使用了一個表(ljrq是我的庫中的一張表這個表可以是有權訪問的記錄條數至少為的任意一張表或視圖)來構造出某年月的每一天
  
  )用這些日期和一個已知星期幾的日期相減(是星期天)所得的差再對求模如果所求年月在以前那麼所得的差既是負數求模後所得值范圍為大於小於表示星期六故先將求模的結果加再求的模
  
  )過濾掉結果集中值為的元素然後求count所得即為工作日數目
  
  */
  Result INTEGER;
  BEGIN
  SELECT COUNT(*) INTO Result
  FROM (SELECT MOD(MOD(qrqto_date(yyyymmdd))) weekday
  FROM ( SELECT to_date(ny||tddyyyymmdd) rq
  FROM (SELECT substr(+ROWNUM) dd
  FROM ljrq z WHERE Rownum<=
  ) t
  WHERE to_date(ny||tddyyyymmdd)
  BETWEEN to_date(nyyyyymm)
  AND last_day(to_date(nyyyyymm))
  )q
  ) a
  WHERE aweekday NOT IN();
  RETURN Result;
  END Get_WorkingDays;
  ___________________________________
  
  還有一個版本
  CREATE OR REPLACE FUNCTION Get_WorkingDays(
  ny IN VARCHAR
  ) RETURN INTEGER IS
  /*
  函數名稱Get_WorkingDays
  
  中文名稱求某一年月中共有多少工作日
  
  作者姓名: XINGPING
  
  編寫時間:
  
  輸入參數NY:所求包含工作日數的年月格式為yyyymm
  
  返 回 值整型值包含的工作日數目
  
  算法描述使用Last_day函數計算出參數所給年月共包含多少天根據這個值來構造一個循環在這個循環中先求這個月的每一天與一個已知是星期天的日期(是星期天)的差所得的差再對求模如果所求日期在以前那麼所得的差既是負數求模後所得值范圍為大於小於表示星期六故先將求模的結果加再求的模 如過所得值不等於(即不是星期六和星期天)則算一個工作日
  */
  Result INTEGER := ;
  myts INTEGER;   所給年月的天數
  scts INTEGER;   某天距所差的天數
  rq  DATE;
  djt INTEGER := ; 
  BEGIN
  myts := to_char(last_day(to_date(nyyyyymm))dd);
  LOOP
  rq := TO_date(ny||substr(+djt)yyyymmdd);
  scts := rq to_date(yyyymmdd);
  IF MOD(MOD(scts)+) NOT IN() THEN
  Result := Result + ;
  END IF;
  djt := djt + ;
  EXIT WHEN djt>myts;
  END LOOP;
  RETURN Result;
  END Get_WorkingDays;
  
  以上兩個版本的比較
  
  第一個版本一條SQL語句就可以得出結果不需要編程就可以達到目的但需要使用任意一張有權訪問的記錄條數至少為的一張表或視圖
  
  第二個版本需要編程但不需要表或者視圖
  
  這兩個版本都還存在需要完善的地方即沒有考慮節日如五一十一元旦春節這些節假期都沒有去除這些節假日應該維護成一張表然後通過查表來去除這些節假日
From:http://tw.wingwit.com/Article/program/Oracle/201311/11197.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.