WITH t AS ( SELECT TO_DATE('20221225', 'yyyymmdd') + LEVEL - 1 dt FROM dual CONNECT BY LEVEL <= 380 ) SELECT TO_CHAR(dt, 'yyyy.mm.dd') ymd , TO_CHAR(dt, 'iyyy') iyyy , TO_CHAR(dt, 'iw') iw , TO_CHAR(w, 'mm') imm , (w - m) / 7 + 1 imw FROM (SELECT dt , TRUNC(dt, 'iw') + 3 w -- 주 목요일 , NEXT_DAY(TRUNC(TRUNC(dt, 'iw') + 3, 'mm') - 1, 5) m -- 월 첫 목요일 FROM t ) ;
WITH t AS ( SELECT TO_DATE('20220123', 'yyyymmdd') + LEVEL - 1 dt FROM dual CONNECT BY LEVEL <= 30 ) -- 좀 더 간결하게 가능하네요.(목요일 기준 주차) SELECT TO_CHAR(dt, 'yyyy.mm.dd') ymd , TO_CHAR(dt, 'iyyy') iyyy , TO_CHAR(dt, 'iw') iw , TO_CHAR(thu, 'mm') imm , TO_CHAR(thu, 'w') imw FROM (SELECT dt , TRUNC(dt, 'iw') + 3 thu -- 주 목요일 FROM t ) ;
만약에 그럼 제가 가진 테이블을 'A', 'A' 테이블의 날짜데이터를 가진 컬럼 'a_dt' 가 있다면(단, a_dt는 varchar2)
쿼리를 아래처럼 바꾸려고 했는데, ORA-01843: 지정한 월이 부적합합니다. 이런 오류가 나서 어떻게 수정하면 좋을까요ㅠㅠ
WITH t AS ( SELECT TO_DATE(a_dt, 'yyyymmdd') + LEVEL - 1 dt FROM A CONNECT BY LEVEL <= 365 ) SELECT TO_CHAR(dt, 'yyyy.mm.dd') ymd , TO_CHAR(dt, 'iyyy') iyyy , TO_CHAR(dt, 'iw') iw , TO_CHAR(thu, 'mm') imm , TO_CHAR(thu, 'w') imw FROM (SELECT dt , TRUNC(dt, 'iw') + 3 thu FROM t ) ;
1. Connect By LEVEL 구문은 빼셔야 합니다. with 문도 굳이 사용하실 필요 없습니다.
2. 오류 문구 그대로 부적합한 자료가 있는지 확인해 보셔야 합니다.
SELECT a_dt , TO_CHAR(dt, 'iyyy') iyyy , TO_CHAR(dt, 'iw') iw , TO_CHAR(thu, 'mm') imm , TO_CHAR(thu, 'w') imw FROM (SELECT a_dt -- 1. 원본(문자형) , TO_DATE(a_dt, 'yyyymmdd') dt -- 2. 변형(날짜형) , TRUNC(TO_DATE(a_dt, 'yyyymmdd'), 'iw') + 3 thu -- 3. 해당주 목요일 FROM a ) ;