오라클 DATE 타입 존재하지 않는 날짜 업데이트(2020년02월31일) 0 5 7,489

by 까막 [SQL Query] ORA-01839 Oracle [2020.02.24 11:39:29]


안녕하세요~

 

날짜(DATE)필드에 2020년1월1일~2020년1월31일 데이터가 담겨있습니다.

해당 데이터는 매달 앞에 년월만 당월로 바꿔주는 작업을 배치로 진행중에 있습니다.

update table set 날짜=TO_DATE(TO_CHAR(SYSDATE, 'YYYYMM') || TO_CHAR(날짜, 'DDHH24MISS'), 'YYYYMMDDHH24MISS')

 

그런데 문제는 2월의경우는 29일, 30일 등이 없기때문에

위의 쿼리를 사용하게되면 1월30일을 2월30일로 바꾸는 과정에서 아래와 같은 에러가 납니다.

ORA-01839: 지정된 월에 대한 날짜가 부적합합니다

 

update의 where 조건에 exists같은걸 추가해서

존재하지않는 일이면 업데이트를 하지 말아야할 것 같은데,,

어떤식으로 쿼리를 짜야할지 어렵습니다..

도움받고 싶어서 글을 작성하였습니다

 

 

by 까막 [2020.02.24 12:15:55]

자답입니다.

update table set 날짜=TO_DATE(TO_CHAR(SYSDATE, 'YYYYMM') || TO_CHAR(날짜, 'DDHH24MISS'), 'YYYYMMDDHH24MISS')

WHERE TO_CHAR(SYSDATE, 'YYYYMM') || TO_CHAR(날짜, 'DD') <= to_char(last_day(SYSDATE), 'YYYYMMDD')


by 우리집아찌 [2020.02.24 12:49:19]
-- add_months 함수 이용하시면 됩니다
 
select add_months(to_date('20200331’,'yyyymmdd'),-1)from dual

 


by 까막 [2020.02.24 12:51:58]

이런 방법도 있네요 감사합니다^^


by 마농 [2020.02.24 13:01:34]

1. 문자로 바꾸어 가공하여 다시 날짜로 바꾸지 말고,
 - 그냥 날짜 상태 그대로 날짜 연산을 하세요.
 - ADD_MONTH(날짜, 1)
2. 왜 그래야 하죠?
 - 임시작업, 일회성 작업이라면 이해가 가지만.
 - 정식 프로세스 라면? 설계에 문제가 있는게 아닐런지?


by 까막 [2020.02.24 15:03:28]

답변감사합니다.

운영에서 사용되는것은아니고

테스트 데이터를 만들어놓았는데

 

몇달뒤, 또는 몇년뒤 해당 데이터를 조회하려면

테스트 데이터가 생성된 날짜를 선택해서 조회해야하는 불편함이 있어서

데이터를 매번 당월 기준으로 변경을 하려고 했었습니다.

 

그래서 미리 1일~31일까지 데이터를 생성해 놓고

년월만 변경하려고 했었습니다.

 

그런데 ADD_MONTHS 함수를 쓰려다보니까

1월31일 데이터를 ADD_MONTHS로 하면 2월31이 생기는게 아니고

2월 28일로 데이터가 업데이트 되는 현상을 발견했습니다.

(당연한 얘기인듯하지만 테스트데이터를 만들어놓은 31일 데이터가 유실되는 현상)

 

그래서 ADD_MONTHS를 사용하지 않고 다른방법을 고민했었습니다.

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