ELW의 최종 거래일은 만기일로부터 2영업일 전까지다. 최종 거래일이 1달 남은 ELW의 만기일을 조회해보자.
예제를 위해 아래와 같이 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 AS SELECT c1, CASE WHEN TO_CHAR (c1, 'D') IN ('1', '7') THEN 'Y' ELSE 'N' END c2 FROM (SELECT DATE '2012-01-01' + LEVEL - 1 AS c1 FROM DUAL CONNECT BY LEVEL <= 365); UPDATE t1 SET c2 = 'Y' WHERE c1 = DATE '2012-08-15'; CREATE INDEX t1_x1 ON t1 (c1);
아래 쿼리로 만기일을 구할 수 있다. 2-2번 쿼리를 예로 들면, 2012-08-16의 한달 전인 2012-07-16은 월요일이므로 2영업일 전은 2012-07-12가 된다. 2012-08-14도 마찬가지다. 2012-08-15는 비영업일라서 해당되지 않는다.
VARIABLE v_dt VARCHAR2(8); -- 2-1 EXEC :v_dt := '20120711'; SELECT a.c1 FROM t1 a WHERE a.c1 BETWEEN ADD_MONTHS (TO_DATE (:v_dt, 'YYYYMMDD'), 1) AND ADD_MONTHS (TO_DATE (:v_dt, 'YYYYMMDD'), 2) AND a.c2 = 'N' AND (SELECT /*+ INDEX_DESC(X T1_X1) */ MIN (x.c1) FROM t1 x WHERE x.c1 < ADD_MONTHS (a.c1, -1) AND x.c2 = 'N' AND ROWNUM <= 2) = TO_DATE (:v_dt, 'YYYYMMDD'); C1 ---------- 2012-08-13 1 개의 행이 선택되었습니다. -- 2-2 EXEC :v_dt := '20120712'; / C1 ---------- 2012-08-14 2012-08-16 2 행이 선택되었습니다. -- 2-3 EXEC :v_dt := '20120713'; / C1 ---------- 2012-08-17 1 개의 행이 선택되었습니다.
'Oracle > SQL' 카테고리의 다른 글
최종 변경 이력 조회 (0) | 2014.04.17 |
---|---|
SQL ID 생성 (0) | 2013.09.24 |
데이터 계산 순서 구하기 (0) | 2012.05.11 |
주별 집계 (0) | 2012.05.09 |
주민등록번호 마스킹 (0) | 2012.04.30 |