CHAR(8) 타입의 날짜에 1년후를 구하는 쿼리 문의 0 13 4,871

by 최성수 [SQL Query] [2013.08.07 13:41:23]



안녕하세요.

날짜를 저장하는 컬럼이 있는데 CHAR(8)  타입에 20130807 형태로 저장하고 있습니다.


이 날짜의 1년후 날짜...즉  20140807 의 값을 받고 싶은데,

NOT A VALID MONTH 같은 오라클 에러가 떨어지네요..

SELECT TO_CHAR(ADD_MONTHS(TO_DATE(NVL(TRIM('20130807'),'20010101'),'YYYYMMDD'),12),'YYYYMMDD') FROM DUAL

ORA-01843: not a valid month

INTEVAL 도 써봤는데, 마찬가집니다.

DB툴에서 직접 쿼리 하면 잘 나옵니다.

NLS Charset 같은 걸 봐야하나요?
쿼리로 해결이 되면 좋을 것 같은데, 답이 잘 안나오네요...

도움을 부탁드립니다.


by 풀텀 [2013.08.07 13:50:18]
with t as(
     select '20130807' s_date from dual
 )
select s_date, to_char(to_date(s_date)+365, 'yyyymmdd') e_date from t;

by 우리집아찌 [2013.08.07 13:55:27]
윤년은요.. ^^*

by 풀텀 [2013.08.07 14:00:33]
윤년은 생각지도 못했네요..ㅎㅎ
흠........

by 아린 [2013.08.07 13:58:18]
윤년이 포함된 년도가 있기 때문에,  + 365 하는것 보단 
원래 하신것처럼 add_months + 12 하시는게 좋을듯합니다.

그리고, trim / nvl 함수는 왜 하셨는지..

SELECT '20130807' dt1
     , TO_CHAR(ADD_MONTHS(TO_DATE('20130807', 'yyyymmdd'), 12), 'yyyymmdd') dt2
     FROM dual


+ 10000 도 윤년에 포함되네요..

by 마농 [2013.08.07 14:18:44]
+ 10000 방법은 윤달 오류 발생
'20120229'(O) + 10000 = '20130229'(X)

by rise2top [2013.08.07 13:59:16]

저도 질문하고 싶은게.. DB Tool이랑 sqlplus 모두 값이 나오긴 하는데.. 어디서 안나오는건지 ㄷㄷ
그리구 TRIM은 어떠한 연유로..?


by 우리집아찌 [2013.08.07 14:14:10]
아마 날짜에 해당되지 않는 데이타가 있지 않나 싶어요..

예를 들어 20130835 ..

by 우리집아찌 [2013.08.07 14:17:03]
-- 아린님꺼 배꼈어요..
-- 2012년 2월 29일 윤년으로 하루 늘어난 날짜 입니다.
SELECT dt1
   , TO_CHAR(ADD_MONTHS(TO_DATE(dt1, 'yyyymmdd'), 12), 'yyyymmdd') dt2
   , TO_CHAR(dt1 + 1000 ) dt3
 FROM (SELECT '20120229' AS dt1 FROM dual) T

by 최성수 [2013.08.07 14:20:04]

감사합니다..

아린님이 알려주신 세번째에
아래와 같이 쓰니 되네요..

다른건 아무리 해도 안먹힙니당ㅜㅜ

NVL(TO_CHAR('20130807'_DT + 10000),'없음') as  A

10000 을 더하니 나오는게 신기할 따름입니당..

제가 공부를 더 해야할 것 같습니다^^;

TRIM은 이상하게도 화면에 빈값이 나오길래 공백처리 할려고 했고
NVL은 값이 없는게 있어서 화면에 없음이라고 뿌려 줄려고 했네요.

감사합니다.

by 아린 [2013.08.07 14:22:55]
답변 쓰고 보니  + 10000 도 윤년도 포함되네요.

함수 안되는 이유를 먼저 알아야 겠네요.

by 마농 [2013.08.07 14:23:13]

+ 10000 방법은 윤달 오류 발생
'20120229'(O) + 10000 = '20130229'(X)


by 마농 [2013.08.07 14:21:20]
-- 쿼리문에는 문제가 없구요.
-- 데이터에 문제가 있네요.
-- 에러메시지가 아주 친절하게 월이 잘못이라고 하네요.
-- 월이 잘못된 자료를 찾아 고치세요.
SELECT *
  FROM t
 WHERE SUBSTR(dt, 5, 2) NOT BETWEEN '01' AND '12'
;

by 최성수 [2013.08.07 14:30:41]

헉...마농님

데이터 하나 때문에 그런 것 같습니다..;;

데이터를 제가 꼼꼼하게 확인을 못했네요.

CHAR(8) 타입인데,  "2011231 "   이런 식으로 하나가 들어가 있었네요...;;

이제 다른 방법도 다 됩니다

여러분들 고생 시켜드렸습니당..

많이 배웠습니다..

감사합니다..^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입