현재 기준 TO_CHAR (SYSDATE - 100, 'MMDD')는 1013
TO_CHAR (SYSDATE + 100, 'MMDD')는 0430 이니
1013보다 크고 0430보다 작은 데이터는 없는 거죠ㅋ
15일일 경우는 0106, 0205로 조건이 만족 되는 거구요
연도 조건까지 붙여서 하셔야 할 거 같아요.
월만 가지고 판단할 때 작년생일, 올해생일, 내년생일이 100일 안인 데이터면 맞을 거 같네요.
SELECT * FROM BIRTH WHERE TO_CHAR (SYSDATE, 'YYYY') || SUBSTR (BIRTH_DAY, 5) BETWEEN TO_CHAR (SYSDATE - 100, 'YYYYMMDD') AND TO_CHAR (SYSDATE + 100, 'YYYYMMDD') OR TO_CHAR (SYSDATE - 366, 'YYYY') || SUBSTR (BIRTH_DAY, 5) BETWEEN TO_CHAR (SYSDATE - 100, 'YYYYMMDD') AND TO_CHAR (SYSDATE + 100, 'YYYYMMDD') OR TO_CHAR (SYSDATE + 366, 'YYYY') || SUBSTR (BIRTH_DAY, 5) BETWEEN TO_CHAR (SYSDATE - 100, 'YYYYMMDD') AND TO_CHAR (SYSDATE + 100, 'YYYYMMDD')
*창조님 말씀 듣고 366으로 변경
WITH birth AS ( SELECT '19881012' birth_day FROM dual UNION ALL SELECT '19941013' FROM dual UNION ALL SELECT '19970304' FROM dual ) SELECT * FROM birth , (SELECT TO_CHAR(sysdate - 100, 'mmdd') s , TO_CHAR(sysdate + 100, 'mmdd') e FROM dual ) WHERE (s <= e AND SUBSTR(birth_day, 5) BETWEEN s AND e ) OR (s > e AND (SUBSTR(birth_day, 5) >= s OR SUBSTR(birth_day, 5) <= e)) ;
SELECT BIRTH_DAY FROM BIRTH WHERE (BIRTH_DAY BETWEEN TO_CHAR(TO_DATE(SUBSTR(BIRTH_DAY,1,4)||DECODE(TO_CHAR(SYSDATE,'MMDD'),'0229','0228',TO_CHAR(SYSDATE,'MMDD')),'YYYYMMDD')-100,'YYYYMMDD') AND TO_CHAR(TO_DATE(SUBSTR(BIRTH_DAY,1,4)||DECODE(TO_CHAR(SYSDATE,'MMDD'),'0229','0228',TO_CHAR(SYSDATE,'MMDD')),'YYYYMMDD')+100,'YYYYMMDD')) OR (BIRTH_DAY BETWEEN TO_CHAR(ADD_MONTHS(TO_DATE(SUBSTR(BIRTH_DAY,1,4)||DECODE(TO_CHAR(SYSDATE,'MMDD'),'0229','0228',TO_CHAR(SYSDATE,'MMDD')),'YYYYMMDD')-100,-12),'YYYYMMDD') AND TO_CHAR(ADD_MONTHS(TO_DATE(SUBSTR(BIRTH_DAY,1,4)||DECODE(TO_CHAR(SYSDATE,'MMDD'),'0229','0228',TO_CHAR(SYSDATE,'MMDD')),'YYYYMMDD')+100,-12),'YYYYMMDD')) OR (BIRTH_DAY BETWEEN TO_CHAR(ADD_MONTHS(TO_DATE(SUBSTR(BIRTH_DAY,1,4)||DECODE(TO_CHAR(SYSDATE,'MMDD'),'0229','0228',TO_CHAR(SYSDATE,'MMDD')),'YYYYMMDD')-100,+12),'YYYYMMDD') AND TO_CHAR(ADD_MONTHS(TO_DATE(SUBSTR(BIRTH_DAY,1,4)||DECODE(TO_CHAR(SYSDATE,'MMDD'),'0229','0228',TO_CHAR(SYSDATE,'MMDD')),'YYYYMMDD')+100,+12),'YYYYMMDD')) ;
이렇게 하면 BIRTH_DAY 로 인덱스 만들면 INDEX FULL SCAN 할거 같은데...