Oracle SQL 강좌
Datetime Functions (날짜 함수) 25 22 99,999+

by 구루비 ADD_MONTH SYSDATE LAST_DAY MONTH_BETWEEN SYSDATE SYSTIMESTAMP TRUNC ROUND [2002.01.20]


날짜 함수는 오라클 날짜에 대해 연산을 한다.

날짜 함수는 NUMBER형 값 또는 DATE형의 값을 RETURN 한다.

SYSDATE

SYSDATE 함수를 사용하면 현재 일자와 시간(시스템기준)을 얻을 수 있다.

최소단위 = 1초

 
-- SYSDTE 예제
SELECT TO_CHAR(SYSDATE,'RRRR-MM-DD HH24:MI:SS') "지금시간" 
  FROM DUAL ;

SELECT TO_CHAR(SYSDATE-1,'RRRR-MM-DD HH24:MI:SS') "하루전지금시간" 
  FROM DUAL ;

SELECT TO_CHAR(SYSDATE-1/24,'RRRR-MM-DD HH24:MI:SS') "1시간전시간" 
  FROM DUAL ;

SELECT TO_CHAR(SYSDATE-1/24/60,'RRRR-MM-DD HH24:MI:SS') "1분전시간"
  FROM DUAL ;

SELECT TO_CHAR(SYSDATE-1/24/60/10,'RRRR-MM-DD HH24:MI:SS') "6초전시간" 
  FROM DUAL ;

SELECT TO_CHAR(SYSDATE-(5/24 + 30/24/60 + 10/24/60/60),'RRRR-MM-DD HH24:MI:SS') "5시간 30분 10초전" 
  FROM DUAL ;

SYSTIMESTAMP

SYSTIMESTAMP 함수를 사용하면 현재 일자와 시간(시스템기준)을 얻을 수 있다.

최소단위 = 10억분의 1초 (10의 9승)

 
-- SYSTIMESTAMP 예제
SELECT TO_CHAR(SYSTIMESTAMP,'RRRR-MM-DD HH24:MI:SS.FF3')  
  FROM DUAL ;

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

SELECT TO_CHAR(SYSTIMESTAMP -1/24,'RRRR-MM-DD HH24:MI:SS') "1시간전시간" 
  FROM DUAL ;

SELECT TO_CHAR(SYSTIMESTAMP -1/24/60,'RRRR-MM-DD HH24:MI:SS') "1분전시간" 
  FROM DUAL ;

ADD_MONTHS(a, b)

ADD_MONTHS 함수는 a의 날짜에 b의 달을 더한 값을 반환 한다.

 
-- SYSDATE를 이용한 예제
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,3),'RRRR-MM-DD')  "date"
  FROM DUAL; 


-- TIMESTAMP를 이용한 예제
SELECT TO_CHAR(ADD_MONTHS(SYSTIMESTAMP,3),'RRRR-MM-DD')  "date"
  FROM DUAL;

MONTHS_BETWEEN(a1, a2)

MONTHS_BETWEEN은 a1과 a2 사이의 달의 수를 NUMBER형 타입으로 반환 한다.

 
-- 두 일자 사이에 달의 수를 조회하는 예제
SELECT MONTHS_BETWEEN(TO_DATE('2010-06-05','RRRR-MM-DD'), 
                      TO_DATE('2010-05-01','RRRR-MM-DD'))  "month"   
  FROM DUAL;

-- 두 일자 사이에 일짜 수를 조회하는 예제
SELECT TO_DATE('2010-06-05','RRRR-MM-DD') - 
       TO_DATE('2010-05-01','RRRR-MM-DD')  "Day"   
  FROM DUAL;

LAST_DAY(d)

LAST_DAY 함수는 달의 마지막 날의 날짜를 반환 한다

 
-- LAST_DAY예제
SELECT SYSDATE today, LAST_DAY(SYSDATE) lastday 
  FROM DUAL;

TODAY    LASTDAY
-------- --------
11/05/28 11/05/31 

NEXT_DAY(d, c1)

NEXT_DAY는 돌아오는 명시된 요일의 일자를 반환한다.

요일은 1(일) ~ 7(토)로 입력하면 된다.

-- NEXT_DAY예제
SELECT NEXT_DAY(SYSDATE, 4) "Next Wednesday" 
  FROM DUAL;

Next Wed
--------
11/06/01

-- NEXT_DAY예제
SELECT NEXT_DAY(TO_DATE('20110501','RRRRMMDD'), 2) "5월 첫째주 월요일" 
  FROM DUAL;

5월 첫째
--------
11/05/02

ROUND(d[,F])

ROUND 함수는 F에 지정된 단위로 반올림 한다. F가 연도라면 연도 단위로 반올림 한다. F가 생략되면 날짜를 가장 가까운 날짜로 반올림한다.

-- ROUND예제
SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'YEAR'),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;

SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'MONTH'),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;

SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'DD'),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;

SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS')), 
               'RRRR-MM-DD HH24:MI:SS')   
  FROM DUAL;


-- 실행 결과
2012-01-01 00:00:00
2011-09-01 00:00:00
2011-09-12 00:00:00
2011-09-12 00:00:00

TRUNC(d[,F])

TRUNC 함수는 F에 지정된 단위로 절삭 한다

-- TRUNC예제
SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'YEAR'),
              'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;

SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), MONTH'),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;

SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'DD'),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;

SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS')), 
               'RRRR-MM-DD HH24:MI:SS')   
  FROM DUAL;


-- 실행 결과
2011-01-01 00:00:00 
2011-09-01 00:00:00
2011-09-11 00:00:00
2011-09-11 00:00:00

날짜에 대한 산술 연산

연 산 결과치 사용목적
날짜 + 숫자 날짜 특정한 날로부터 며칠 후의 날짜 계산
날짜 - 숫자 날짜 특정한 날로부터 며칠 전의 날짜 계산
날짜 - 날짜 숫자 두 날짜 사이의 차이를 숫자로 계산

Oracle Datetime Functions

ADD_MONTHS
CURRENT_DATE
CURRENT_TIMESTAMP
DBTIMEZONE
EXTRACT (datetime)
FROM_TZ
LAST_DAY
LOCALTIMESTAMP
MONTHS_BETWEEN
NEW_TIME
NEXT_DAY
NUMTODSINTERVAL
NUMTOYMINTERVAL
ROUND (date)
SESSIONTIMEZONE
SYS_EXTRACT_UTC
SYSDATE
SYSTIMESTAMP
TO_CHAR (datetime)
TO_TIMESTAMP
TO_TIMESTAMP_TZ
TO_DSINTERVAL
TO_YMINTERVAL
TRUNC (date)
TZ_OFFSET

- 강좌 URL : http://www.gurubee.net/lecture/1026

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by goguy [2004.05.08 17:50:17]
내장함수는 select 할때 참고해서 이용하면됩니다.

by 용사 [2005.05.10 19:54:34]
CHAR로 바꿔야 합니다. LASTDAY도 삭제하고요~^^

by 우앙앙 [2005.07.29 10:06:36]
SELECT TO_CAHR(ADD_MONTHS(SYSDATE,3),'RRRR/MM/DD' LASTDAY) "date"
FROM dual ;

>>SELECT TO_CHAR(ADD_MONTHS(SYSDATE,3),'RRRR/MM/DD') "date"
FROM dual

by 우앙앙2 [2005.07.29 10:15:53]
SELECT MONTHS_BETWEEN(TO_DATE('2000/06/05') ,
TO_DATE'2000/09/23')) "Date"
FROM dual ;
이게 맞나요?
SELECT MONTHS_BETWEEN(TO_DATE('2000/06/05','RRRR/MM/DD') ,
TO_DATE('2000/09/23','RRRR/MM/DD')) "Date"
FROM dual
전 왜 이렇게 해야 되죵?ㅠㅠ 알려줘욤

by smile [2005.11.09 20:13:35]
퍼갑니다. ^^

by 홀서기 [2006.06.13 10:29:33]
SQL>SELECT ROUND(TO_DATE('1998/04/11'), 'DAY') FROM dual ;

이 쿼리 결과
1998-04-12

이렇게 나오는데여.....

by 하눌이 [2006.07.12 14:52:31]
ROUND에서 'DAY'를 사용하면 가장 가까운 일요일의 날짜로 나옵니다.
간단히 말하면...
반올림의 단위는 요일이고
결과는 가까운 일요일날짜가 된다는 거네요.
저도 무지하게 고생했습니다... ㅡ.ㅡ;
달력 켜놓고 비교해 보세요.. 이해하기 쉬우실 겁니다.

by 빼인트 [2006.11.14 22:37:40]
ADD_MONTH 함수에서 TO_CAHR 가 잘못 써져있네요.. TO_CHAR로...

by 현양 [2007.04.05 17:58:09]
ROUND() 좀더 쉽게 설명이 안?튿楮??? 결과를 보면.. 막.. 헷갈려요..ㅡㅡ;;;

select round(sysdate,'year') from dual;
이걸 했는.. 연도를 기준으로 반올림을 하는데...
결과가... 2007-01-01 이 나오니까 당황 스러워요...

쉽게 설명좀 부탁 드립니다.

by 포키 [2007.04.18 20:37:57]
* 년도 반올림 - 7월(반) 이상이면 년도가 증가, 반 미만이면 해당년도 첫째날로 변경
년도를 기준으로 했다면 2007년 7월전까지는 반올림이 안되어서
무조건 2007년 1월 1일로 되는 겁니다.
* 월 반올림 - 해당월의 반달치 이상이면 월값이 증가, 아니면 해당월의 첫째날.

예) select round(to_date('2007-07-11'),'year') from dual;
    &이건 년도기준 반올림이니까 당연히 2008-01-01 이겠죠

by 레츠 [2008.04.25 09:49:16]
select TO_CHAR(to_date('20080425'), 'd') from dual
8자리 날짜로 요일을 리턴합니다.
1=월요일 ~ 7=일요일
참고하세요

by 레츠 [2008.04.25 09:55:02]
1=일요일 7=토요일이네요
정정...

by 바드테일 [2009.08.31 13:12:21]
MONTH_BETWEEN -> MONTHS_BETWEEN 아직 정정이 안되었네요..

by 현주니꼬 [2010.10.11 17:07:55]
SELECT MONTHS_BETWEEN(TO_DATE('2000/06/05','RRRR/MM/DD'), TO_DATE('2000/09/23','RRRR/MM/DD')) "Date" FROM DUAL;
전 이렇게 하니 되네요.

by 김정식 [2010.11.01 17:02:34]
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3') FROM DUAL;

by 가증 [2011.03.09 11:13:34]
저는 WHERE SYSDATE BETWEEN TO_DATE('20110201', 'yyyymmdd') AND TO_DATE('20110301', 'yyyymmdd') 를 많이 사용하는대..

by 진 [2012.09.25 12:03:27]

잘 보고 갑니다~

by 서병준 [2012.10.09 22:13:52]
잘보구 가요~~

by 손님 [2013.06.19 17:16:47]
오라클 처음 배우는 사람입니다~ 궁금한게 있는데요.. 
위에서 쿼리문?? 뭐 그런거 하시고 나서 뒤에 FROM DUAL 을 하는 이유가 뭔가요?
인터넷으로 봤을땐 더미테이블? 그걸 이용해서 임시의 값을 출력할때 사용한다.
라고 되있는데 이게 맞는 말인가요?

by 손님 [2013.06.26 13:56:08]

손님  데이터베이스에 존재하는 실제 테이블에 있는 데이터를 사용하지 않고 사용하는 예제의 경우는 굳이 실제 테이블명을 FROM절에 써줄 필요없이 본문처럼 더미테이블에서 돌려도 결과가 나옵니다 따라서 FROM절에 DUAL를 적어주는 걸로 알고 있네요


by 김정식 [2013.12.02 13:52:22]
How to convert timestamp to epoch?

http://www.epochconverter.com/

https://www.mail-archive.com/oracle-plsql@googlegroups.com/msg00715.html

SELECT (SYSDATE - TO_DATE('01/01/1970','MM/DD/RRRR'))*86400 seconds_since_UNIX_epoch  
FROM DUAL;

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