[백업][가리사니] 오라클 date 컨버팅 날짜계산
oracle

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

현재 날짜

SELECT
	SYSDATE,
	SYSTIMESTAMP
FROM DUAL

text로 변환

SELECT
	TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'),
	TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF9')
FROM DUAL

to_char 포멧 참고 : http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924 YYYY / YY : (연도) 잘 쓰이진 않을거 같지만 YYY / Y 같은 형태로 사용할 수도 있습니다. 예) 2016년 || YYYY -> 2016 || YYY -> 016 || YY -> 16 || Y -> 6 MM : (월) 마찬가지로 0112 의 값을 반환합니다. MON 과 MONTH 도 있지만 로컬라이징됨으로 한국어로 설정되어있다면 둘다 "10월" 입니다. DD : (일) 0131의 값입니다. DDD 를 사용할 경우 1366의 값을 같습니다. HH / HH12 / HH24 : (시) 보통 hh가 12시간 HH가 24시간에 익숙하시다면 조심해야합니다. HH는 12시간이며 HH24를 써야 24시간으로 나옵니다. MI : (분) 일반적인 분입니다. 오라클을 비롯한 많은 DBMS는 MM월 mm분이 아닌 MI를 분으로 하는 경우가 많습니다. SS : (초) 일반적으로 흔한 초입니다. FF(숫자 19) : (초이하)

  • 이 값은 SYSDATE 에서 쓸수없으며, SYSTIMESTAMP 에서 사용할 수 있습니다. FF1 0.1초 FF2 0.01초 ... FF9 0.000000001초 예를들어 아래와 같이 썼을경우
SELECT
	TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF9')
FROM DUAL

2016-10-31 01:57:00.320000000 같은 값이 나오게 됩니다. D / DAY : (요일) DAY는 한국어일 경우 [일요일 ~ 토요일]이 나옵니다. D는 특이하게 17의 값이 나오며 1은 일요일입니다. (일반적으로 06에 익숙한 사람에겐 특이합니다.)

날짜계산

숫자기반으로 더하기 이 방법은 SYSTIMESTAMP 에서 사용할 수 없습니다. 1이 하루이기 때문에 + 3 이라고하면 3일 이후가 나옵니다. 시간이라고하면 (1/247)하면 7시간 : 하루 / 24[분] * 원하는시간 마찬가지로 분이라고하면 (1/24/6017) 17분 외우기는 간단하지만 상당히 생소한 방법입니다.

SELECT
	to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS 오늘SD,
	to_char(SYSDATE + 3, 'YYYY-MM-DD HH24:MI:SS') AS 연산SD3일, -- 3일더함
	to_char(SYSDATE + 3 + (1/24*5), 'YYYY-MM-DD HH24:MI:SS') AS 연산SD2일5시간 -- 2 5시간 더함
FROM DUAL

INTERVAL 로 더하기 옵션으로 YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 옵션을 사용할 수 있습니다. 또한 DAY TO SECOND 같은 TO 옵션도 사용할 수 있습니다.

SELECT
	-- SYSDATE
	to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS 오늘SD,
	-- 3 20시간 11 22초를 이후
	to_char(SYSDATE + INTERVAL '3 20:11:22' DAY TO SECOND, 'YYYY-MM-DD HH24:MI:SS') AS 연산SD1,
	-- 3시간 이전
	to_char(SYSDATE - INTERVAL '3' HOUR, 'YYYY-MM-DD HH24:MI:SS') AS 연산SD2,
	-- SYSTIMESTAMP
	to_char(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS 오늘ST,
	-- 32  이후
	to_char(SYSTIMESTAMP + INTERVAL '32' MINUTE, 'YYYY-MM-DD HH24:MI:SS') AS 연산ST1,
	-- 99 이후 (DAY의 MAX  99 입니다.)
	to_char(SYSTIMESTAMP + INTERVAL '99' DAY, 'YYYY-MM-DD HH24:MI:SS') AS 연산ST2
FROM DUAL

불행이도 숫자기반보다 조금 위험한 점이있습니다. 예를들어 DAY의 경우 99 이상의 값을 넣을 수 없습니다. 즉 DAY를 더해주는 단순연산이라면 오히려 위 숫자방법이 나을 수 있습니다. 비교

SELECT
  -- 3시간 이후 값에서 현재값을 제거
  -- 0.125 차이
	(SYSDATE + INTERVAL '3' HOUR) - SYSDATE
FROM DUAL