1. 程式人生 > >Oracle當前日期的下個半月,例如今天的下個半月是十月一號到十月十五號,如果是上半月,則顯示本月的下半月

Oracle當前日期的下個半月,例如今天的下個半月是十月一號到十月十五號,如果是上半月,則顯示本月的下半月

CREATE OR REPLACE FUNCTION FUN$_GETMONTH
RETURN VARCHAR2 IS


  /***************************
*用途:根據當前日期,判斷是上半月還是下半月,如果是下半月,則顯示下月的上半月(201801001-21081015),如果是上半月,則顯示本月的下半月
      思路:先求出本月的對應幾號和本月最後一天是幾號
            然後求出下個月,進行一一判斷
*
********************************************/
 V_RETURN VARCHAR2(20);--返回值20181001-20181015
 V_DATE NUMBER;--當前日期對應的幾號
 V_MONTH NUMBER;--每個月的最後一天是幾號,比如9月是30號
 V_CURR_MONTH VARCHAR2(6);--本月的日期
 V_NEXT_MONTH VARCHAR2(6);--下個月的日期

 BEGIN

 --當前日期對應的幾號
   SELECT TO_NUMBER(TO_CHAR((SYSDATE), 'DD'))  INTO V_DATE FROM DUAL;

   --取得每個月的最後一天是30 還是31 還是28 29
   SELECT TO_NUMBER(TO_CHAR(LAST_DAY(SYSDATE), 'DD')) INTO V_MONTH  FROM DUAL;

   --獲取下一個月201810
   SELECT TO_CHAR(ADD_MONTHS(SYSDATE,1),'YYYYMM') INTO V_NEXT_MONTH FROM DUAL;
    --獲取本月個月201809
   SELECT TO_CHAR((SYSDATE),'YYYYMM') INTO V_CURR_MONTH FROM DUAL;

   --判斷一個月是30天
   IF V_MONTH =30 THEN
     IF V_DATE<=15 THEN
         V_RETURN :=V_CURR_MONTH||'16'||'-'||V_CURR_MONTH||'30';
     ELSE
       V_RETURN :=V_NEXT_MONTH||'01'||'-'||V_NEXT_MONTH||'15';
     END IF;

  --判斷一個月31天
   ELSIF V_MONTH =31 THEN
    IF V_DATE<=15 THEN
        V_RETURN :=V_CURR_MONTH||'16'||'-'||V_CURR_MONTH||'31';
     ELSE
       IF TO_NUMBER(TO_CHAR(TO_DATE(V_NEXT_MONTH,'YYYYMM'), 'MM')) = 2 then --下一個月是2月,上半月只有14天

          V_RETURN :=V_NEXT_MONTH||'01'||'-'||V_NEXT_MONTH||'14';
       else
          V_RETURN :=V_NEXT_MONTH||'01'||'-'||V_NEXT_MONTH||'15';
       END IF;
     END IF;
  --判斷2月只有28天
   ELSIF V_MONTH = 28 THEN
    IF V_DATE<=14 THEN
        V_RETURN :=V_CURR_MONTH||'15'||'-'||V_CURR_MONTH||'28';
     ELSE
       V_RETURN :=V_NEXT_MONTH||'01'||'-'||V_NEXT_MONTH||'15';
     END IF;
  --判斷2月只有29天
   ELSIF V_MONTH = 29 THEN
      IF V_DATE<=14 THEN
        V_RETURN :=V_CURR_MONTH||'01'||'-'||V_CURR_MONTH||'15';
     ELSE
       V_RETURN :=V_NEXT_MONTH||'15'||'-'||V_NEXT_MONTH||'29';
     END IF;
   END IF;
   DBMS_OUTPUT.PUT_LINE('V_DATE:'||V_DATE);
   DBMS_OUTPUT.PUT_LINE('V_RETURN:'||V_RETURN);
   RETURN V_RETURN;

   --異常,報錯處理
  EXCEPTION WHEN
    OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('函式有誤。');
    RETURN NULL;
 END;
/