Oracle/SQL2012. 7. 12. 14:29

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
Posted by 정희락_