안녕하세요.
쿼리 공부하다가 궁금증이 생겨서 문의 드립니다.
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으로 없어져 버리는거 같더라구요..
조언 부탁드리겠습니다.^^
즐거운 하루 되세요.
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) ;