오라클 날짜계산

SQL/Oracle 2013. 3. 18. 14:33

 

오라클 날짜계산

** 날짜계산

-- '2011-01-20' 과 당일 사이의 달의 수를 NUMBER형 타입으로 반환
-- MONTHS_BETWEEN(A,B) = A-B/30
SELECT MONTHS_BETWEEN(SYSDATE,TO_DATE('2011-01-20','YYYY-MM-DD')) FROM DUAL;


-- 특정일의 달수 더한 날
SELECT ADD_MONTHS(SYSDATE, 10) FROM DUAL;


-- 특정일의 다음주 요일
SELECT NEXT_DAY(SYSDATE,'FRIDAY') FROM DUAL;


-- 특정일의 해당 월의 마지막 날
SELECT LAST_DAY(SYSDATE) FROM DUAL;

-- 특정일의 반올림(오후면 다음날..)
SELECT ROUND(SYSDATE,'DD') FROM DUAL;

-- 특정일의 전주 토요일(해당 전주의 마지막 날)에해당하는 날짜
SELECT TRUNC(SYSDATE,'WW') FROM DUAL;

-- 특정일의 주 일요일(해당 주의 첫째 날)에해당하는 날짜
SELECT TRUNC(SYSDATE,'D') FROM DUAL;


** WHERE 조건에 날짜칼럼을 기준으로 함.
/* 어제 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE - 1) AND TRUNC(SYSDATE - 1) + 0.99999421
/* 오늘 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + 0.99999421
/* 내일 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE + 1) AND TRUNC(SYSDATE + 1) + 0.99999421
/* 금주 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE + 1) - TO_CHAR(SYSDATE, 'D') AND TRUNC(SYSDATE + 1) - TO_CHAR(SYSDATE, 'D') + 6.99999421
/* 다음주 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE + 8) - TO_CHAR(SYSDATE, 'D') AND TRUNC(TRUNC(SYSDATE) + 14.99999421) - TO_CHAR(SYSDATE, 'D')
/* 금월 */ 날짜칼럼
BETWEEN TRUNC(SYSDATE + 1) - TO_CHAR(SYSDATE, 'DD') AND TRUNC(LAST_DAY(SYSDATE)) + 0.99999421
/* 전월 */ 날짜칼럼
BETWEEN TRUNC(ADD_MONTHS(SYSDATE, -1) + 1) - TO_CHAR(SYSDATE,'DD') AND TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE, -1))) + 0.99999421
/* 다음달 */ 날짜칼럼
BETWEEN ADD_MONTHS(TRUNC(SYSDATE), 1) - TO_CHAR(SYSDATE, 'DD') + 1 AND LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE), 1) + 0.99999421)


** 특정일 까지의 간격을 년, 개월, 일로 표현하기
SELECT
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20000101', 'YYYYMMDD'))/12) "년",
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20000101', 'YYYYMMDD')) -
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20000101', 'YYYYMMDD'))/12) * 12) "개월",
TRUNC((MONTHS_BETWEEN(SYSDATE,TO_DATE('20000101', 'YYYYMMDD')) -
TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20000101', 'YYYYMMDD')))) * 30.5) "일"
FROM DUAL;

** 당월의 주차 구하기..
SELECT
'20000101' AS "날짜", CEIL((TO_NUMBER(SUBSTRB('20000101', -2, 2)) + 7 - TO_NUMBER(TO_CHAR(TO_DATE('20000101', 'YYYYMMDD'), 'D'))) / 7) AS "월별 주차"
FROM DUAL;


** 시간 계산 SQL
SELECT TRUNC(TO_DATE('20110101012345', 'YYYYMMDDHH24MISS') - TO_DATE('20110501213344', 'YYYYMMDDHH24MISS')) || ' DAY ' ||
TRUNC(MOD((TO_DATE('20110101012345', 'YYYYMMDDHH24MISS') - TO_DATE('20110501213344', 'YYYYMMDDHH24MISS')), 1) * 24)|| ' HOUR ' ||
TRUNC(MOD((TO_DATE('20110101012345', 'YYYYMMDDHH24MISS') - TO_DATE('20110501213344', 'YYYYMMDDHH24MISS')) * 24, 1) * 60)|| ' MINUTE ' ||
TRUNC(ROUND(MOD((TO_DATE('20110101012345', 'YYYYMMDDHH24MISS') - TO_DATE('20110501213344', 'YYYYMMDDHH24MISS')) * 24 * 60, 1) * 60))|| ' SEC '
" TIME INTERVAL "
FROM DUAL ;

[출처] [ORACLE] 오라클 날짜계산 |작성자 구름나그네

 

 

오라클에서 요일구하기
to_char(날짜, 'd')
ex) select to_char(sysdate, 'd') from dual;
========================================
1 : 일요일
2 : 월요일
3 : 화요일
4 : 수요일
5 : 목요일
6 : 금요일
7 : 토요일
========================================

 

-- Week 값 반환  ---

W: 해당월내에서 몇주인지

WW: 해당년내에서 몇주인지

IW: 1년중에서 몆주인지

 

WW와 IW는 같다

주의사항) W, WW, IW 등 모두가 일요일 시작이 아닌 월요일 시작으로 계산됨

예를 들어,

 

 날짜

요일 

 TO_CHAR('', 'IW')

 20130317

일요일 

 11

 20130318

월요일

 12

때문에, 일요일 시작 Week값을 구하려면 해당 날짜에 + 1 이 필요

TO_CHAR( SYSDATE + 1, 'IW'), TO_CHAR( TO_DATE('20130317', 'YYYYMMDD')  + 1, 'IW')

 

참고로, TO_CHAR( SYSDATE, 'D') 값은 일요일 부터 시작

일:1, 월:2, 화:3, 수:4, 목:5, 금:6, 토:7

---------------

: