공휴일을 제외한 두 날짜의 차이 구하기
나름 골머리 썩혀가며 만들어 봤다.
CREATE OR REPLACE FUNCTION diff_sec_business (
i_start_date IN DATE,
i_end_date IN DATE
)
RETURN NUMBER
IS
start_date DATE := i_start_date;
end_date DATE := i_end_date;
curr_date DATE := i_start_date;
holl_count NUMBER := 0;
diff_count NUMBER := 0;
BEGIN
-- 주말(토,일)의 횟수를 센다.
IF end_date - start_date <= 0
THEN
RETURN (holl_count);
ELSE
LOOP
curr_date := TO_DATE (curr_date + 1);
EXIT WHEN curr_date > end_date;
IF TO_CHAR (curr_date, 'D') = '1' OR TO_CHAR (curr_date, 'D') = '7'
THEN
holl_count := holl_count + 1;
END IF;
END LOOP;
END IF;
-- 마지막 날이 주말이면 마지막날의 시간은 무시한다.
IF TO_CHAR (end_date, 'D') = '1' OR TO_CHAR (end_date, 'D') = '7'
THEN
end_date := TO_DATE (TO_CHAR (end_date, 'YYYYMMDD'), 'YYYYMMDD');
END IF;
-- 시작된 날이 주말이면 다음날의 00시부터 시작된다.
IF TO_CHAR (start_date, 'D') = '1' OR TO_CHAR (start_date, 'D') = '7'
THEN
start_date :=
TO_DATE (TO_CHAR (start_date + 1, 'YYYYMMDD'), 'YYYYMMDD');
END IF;
-- 시간 차이 계산
diff_count := end_date - start_date;
-- 차이 시간에서 공휴일 제외
diff_count := diff_count - holl_count;
RETURN diff_count * 24 * 60 * 60;
END;
/