TIMESTAMP 계산 질문입니다. 0 2 3,051

by 깽즈 [SQL Query] [2014.05.15 10:03:07]


안녕하세요.

쿼리 공부하다가 궁금증이 생겨서 문의 드립니다.

TIMESTAMP 타입을 가지고 계산을 하는 중에 아래와 같은 쿼리로 조회를 해보았습니다.

 

SELECT TO_TIMESTAMP('2014-05-14-15.28.41.057016','YYYY-MM-DD-HH24.MI.SS.FF') A,
       (TO_TIMESTAMP('2014-05-14-15.28.41.057016','YYYY-MM-DD-HH24.MI.SS.FF') - 3/24) B,
       TO_TIMESTAMP((TO_TIMESTAMP('2014-05-14-15.28.41.057016','YYYY-MM-DD-HH24.MI.SS.FF') - 3/24), 'YYYY-MM-DD-HH24.MI.SS.FF') C,
       SYSDATE - TO_TIMESTAMP('2014-05-14-15.28.41.057016','YYYY-MM-DD-HH24.MI.SS.FF') D
  FROM DUAL;

위의 결과가 아래와 같이 나오는데요...

A B C D
2014-05-14 15:28:41.057016000 2014-05-14-12:28:41 0014-05-14 00:00:00. +00 18:27:50.942984

TIMESTAMP 타입에서 시간을 뺀 C컬럼의 포멧과, TIMESTAMP 까지 뺄셈을 한 D 컬럼의 포맷이

일반 TIMESTAMP 타입인 A 컬럼의 포맷과 다른데요.

C, D 컬럼의 포맷을 A 컬럼의 포맷처럼 출력하려면 어떻게 해야 되는지 해서요.

그냥 to_char 함수를 사용하면 밀리세컨드 부분이 0으로 없어져 버리는거 같더라구요..

 

조언 부탁드리겠습니다.^^

즐거운 하루 되세요.

 

 

by 마농 [2014.05.15 10:33:57]

A. TimeStamp
B. TimeStamp - Number = Date(날짜)
C. 오류 가능성을 가진 안좋은 코딩.
D. Date - TimeStamp = Interval(시간차)
E. Date - Date = Number(일수)
F. Date - Number = Date(날짜)
G. TimeStamp - Interval  = TimeStamp


TO_TIMESTAMP 의 입력값은 문자열이 와야 하는데 C 에서는 Date 형을 입력했습니다.
이 경우 Date 가 문자로 자동 형변환 되며, 자동 형변환시 포맷은 시스템 설정값에 따릅니다.
이 경우는 시스템 설정값이 연월일 까지만 표시되는 경우입니다.
다행스럽게도 에러는 안났습니다만...
이걸 다행이라 생각하면 안됩니다. 차라리 에러가 나야 다행인거죠.
설정값이 mm dd yyyy 나 dd mon yy 일 경우 에러가 나겠지요.
날짜 타입을 다룰 때는 자동형변환이 되지 않도록 명시적으로 사용해야 합니다.

SELECT a
     , a - INTERVAL '3' HOUR c
     , systimestamp - a d
  FROM (SELECT TO_TIMESTAMP('2014-05-14-15.28.41.057016', 'yyyy-mm-dd-hh24.mi.ss.ff') a FROM dual)
;

 


by 깽즈 [2014.05.15 10:36:31]

마농님 감사합니다.

 

보내주신 내용으로 다시 테스트 해보겠습니다.

 

즐거운 하루 되세요.

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