CREATE OR REPLACE PROCEDURE INPUT_DATE(NEW_DATE VARCHAR) --YYYYMMDD VARCHAR
AS
D_DATE DATE;
V_SQL VARCHAR2(200);
--VAR_DATE VARCHAR2(10)
BEGIN
D_DATE := TO_DATE(NEW_DATE,'YYYYMMDD'); --日期格式
--VAR_DATE = TO_CHAR(D_DATE,'YYYYMMDD') --字符串格式
V_SQL := 'INSERT INTO YSY_TEST SELECT :i,D_DATE,:PINDU FROM TABLE_NAME WHERE MODIFY_DATE>= :STARTDATE AND MODIFY_DATE <= :VAR_DATE';
FOR I IN 1..5 LOOP
IF I = 1 AND D_DATE = TO_CHAR(LAST_DAY(D_DATE),'YYYYMMDD') then --判断D_DATE是否为月末最后一天
START_DATE := TO_CHAR(TRUNC(D_DATE,'MM'),'YYYYMMDD');--本月初
EXECUTE IMMEDIATE V_SQL USING i,D_DATE,START_DATE,D_DATE;
COMMIT;
ELSE IF I = 2 AND MOD(TO_NUMBER(TO_CHAR(D_DATE,'MM')),3) = 0 --判断D_DATE是否为3、6、9、12
AND D_DATE = ADD_MONTHS(TRUNC(D_DATE,'Q'),3)-1 THEN --判断D_DATE是否为季的最后一天
START_DATE := TRUNC(D_DATE,'Q'); --季初
EXECUTE IMMEDIATE V_SQL USING i,NEW_DATE,START_DATE,D_DATE;
COMMIT;
ELSE IF I = 3 AND TO_CHAR(D_DATE,'MM') <'07' --判断是否为上半年
AND NEW_DATE = ADD_MONTHS(TRUNC(D_DATE,'YYYY'),6)-1 THEN --判断是否为上半年最后一天
START_DATE := TRUNC(D_DATE,'YYYY'); --上半年初
EXECUTE IMMEDIATE V_SQL USING i,D_DATE,START_DATE,D_DATE;
COMMIT;
ELSE IF I = 4 AND TO_CHAR(D_DATE, 'MM') > '06' --判断是否为下半年
AND NEW_DATE = ADD_MONTHS(TRUNC(D_DATE,'YYYY'),12)-1 THEN --判断是否为下半年最后一天
START_DATE := ADD_MONTHS(TRUNC(D_DATE,'YYYY'),6); --下半年初
EXECUTE IMMEDIATE V_SQL USING i,D_DATE,START_DATE,D_DATE;
COMMIT;
ELSE IF I = 5 AND NEW_DATE = ADD_MONTHS(TRUNC(D_DATE,'YYYY'),12)-1 THEN --判断是否为年末最后一天
START_DATE := TRUNC(D_DATE,'YYYY'); --年初
EXECUTE IMMEDIATE V_SQL USING i,D_DATE,START_DATE,D_DATE;
COMMIT;
END IF;
END LOOP;
END INPUT_DATE;