오라클 TO_CHAR형식으로 날짜비교하는 방식 위험? 0 8 7,372

by 메시 [2016.12.16 11:02:53]


오라클 TO_CHAR 날짜 비교하는거는 조금 위험한 방법인가요?

아래처럼 쿼리에서 보면 특정날짜를 받아와서 현재일자 30일 비교해서

이전이면 Y아니면 N으로 체크하려고 하거든요.

이런식으로 TO_CHAR로 해서 날짜 체크하면 정합성에 맞을까요?

 

보통은 TO_DATE형식으로 치환해서 일자서로 빼기해서 체크하는데 제가 쓰는 언어쪽에

TO_DATE형식으로 변환부분이 사용하려면 하면 인식을 못해서 다른방법을 찾아보고 있거든요.

 

 SELECT  CASE WHEN TO_CHAR(SYSDATE-30,'YYYYMMDD') <= TO_CHAR(SYSDATE,'YYYY')||:pram THEN 'Y'
             ELSE 'N' END 
          INTO :date
        FROM DUAL;

by 랑에1 [2016.12.16 11:55:07]

이전 이후 비교 정도는 상관없을 것 같은데요.(날짜 계산은 당연히 위험할 것 같구요.)

다만 비교시 date 타입으로 되어있는 컬럼을 구지 to_char로 가공할 필요는 없겠지요.

 


by 우리집아찌 [2016.12.16 13:07:00]

쿼리에서 왜 to_date 함수가 안될까요???


by 메시 [2016.12.16 14:15:37]

쿼리는 잘 돌아가는데.

proc*c 언어에서 to_date 두 날짜 일자 계산해서 받아오면 값을 인식을 못하고 

0으로만 인식되더라구요.


by 마농 [2016.12.16 13:56:13]

1. TO_DATE 로 해서 안될 것은 없습니다.
  - 뭔가 적용과정에 실수가 있었을 듯 하구요.
  - TO_CHAR 로 하신 부분은 적절하게 잘 적용하셨구요.
2. TO_DATE 로 적용하는 것이 오히려 위험합니다.
  - TO_CHAR(sysdate) 은 오류날 이유가 없지만.
  - TO_DATE(:pram) 은 입력값에 따라 오류가 날 가능성이 있죠.


by 메시 [2016.12.16 14:16:17]

pro*c언에서 to_date 두 날짜 일자 계산해서 받아오면

인식을 못하는것 같더라구요.


by 마농 [2016.12.16 15:35:02]

예시 쿼리는 정상인것을 올려 놓고 비정상 쿼리에 대한 질문을 하시네요.


by 메시 [2016.12.16 16:00:34]
아래 쿼리가 PRO*C에서 오류가 나네요.
 
< 오류 >
EXEC SQL 
SELECT TO_DATE(TO_CHAR(SYSDATE,'YYYYMMDD'))- TO_DATE(TO_CHAR(SYSDATE,'YYYY')||:pram_date) 
, TO_DATE(TO_CHAR(SYSDATE,'YYYYMMDD')) - TO_DATE(TO_CHAR(SYSDATE,'YYYY')||:pram_date) 
INTO :day_cnt ,:day
 FROM DUAL;
 
< 정상 >
SELECT 10, 30
INTO :day_cnt ,:day
 FROM DUAL;

by 마농 [2016.12.16 16:19:26]

1. 오류는
  - TO_DATE() 사용시 포멧('yyyymmdd')이 지정되지 않아서 오류나는 거구요.
2. TO_DATE(TO_CHAR(sysdate)) 은 잘못 사용하신 예입니다.
  - TRUNC(sysdate) 하시면 됩니다.
3. 위험성은
  - pram 값으로 '0229' 등이 들어오는 경우 에러가 날 수 있습니다.
  - 따라서 기존 TO_CHAR 로 비교하는 것을 추천합니다.

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