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;
/