날짜 함수는 오라클 날짜에 대해 연산을 한다.
모든 날자 함수는 숫자값을 리턴하는데 MONTHS_BETWEEN을 제외하고는 DATE형을 리턴한다.
1. MONTHS_BETWEEN 함수
1) 날짜와 날짜 사이의 월수를 계산한다.
2) 결과는 음수 또는 양수가 될 수 있다.
3) 결과의 정수부분은 월을, 소수부분은 일을 나타낸다.
사용법> MONTHS_BETWEEN(date1, date2)
예> MONTHS_BETWEEN(sysdate, hiredate) ==> 212.04794
문제> EMP 테이블에서 10번 부서원의 현재까지의 근무 월수를 계산하여 출력하여라.
SELECT ename, hiredate, SYSDATE, MONTHS_BETWEEN(SYSDATE, hiredate) m_between,
TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate), 0) t_between
FROM emp
WHERE deptno = 10
ORDER BY MONTHS_BETWEEN(SYSDATE, hiredate) DESC
ENAME HIREDATE SYSDATE M_BETWEEN T_BETWEEN
-------------------- -------- -------- ---------- ----------
CLARK 81/06/09 08/12/29 330.667913 330
KING 81/11/17 08/12/29 325.409848 325
MILLER 82/01/23 08/12/29 323.2163 323
2. ADD_MONTHS 함수
날짜에 월을 더하고 빼는 함수이다. 결과는 날짜형.
사용법> ADD_MONTHS(date1, n)
예> ADD_MONTHS(hiredate , 5) => 82/06/23
//기존의 날짜에서 5개월을 더한 값이다.
문제> EMP 테이블에서 10번 부서원의 입사 일자로부터 5개월이 지난 후 날짜를 계산하여 출력.
SELECT ename, hiredate, ADD_MONTHS(hiredate, 5) a_month
FROM emp
WHERE deptno = 10
ORDER BY hiredate DESC;
ENAME HIREDATE A_MONTH
-------------------- -------- --------
MILLER 82/01/23 82/06/23
KING 81/11/17 82/04/17
CLARK 81/06/09 81/11/09
3. NEXT_DAY 함수
1) 명시된 요일의 돌아오는 날짜를 계산한다.
2) 요일 뿐 아니라 숫자도 기술 가능(SUNDAY:1, MONDAY:2......)
3) NLS_LANG이 KOREAN_KOREA.KO16KSC5601로 되어 있으면 한글도 사용 가능.
월요일, 화요일...(월,화,수..와 같이 넣을 수 도 있다.)
사용법> NEXT_DAY(date1, 'string' | n)
예> NEXT_DAY(hiredate, 'FRIDAY') ==> 82/01/29
// 10g에서는 'FRIDAY', 'SUNDAY'와 같은 영문 표시형식이 안되는데,
// 다른 표기법이 있을지도 므르겠지만 아무튼 위 표시형식은 안된다.
NEXT_DAY(hiredate, '금요일') ==> 82/01/29
문제> EMP테이블에서 10번 부서원의 입사 일자로부터 돌아오는 금요일을 계산하여 출력하여라.
SELECT ename, hiredate, NEXT_DAY(hiredate, '금요일') n_day,
NEXT_DAY(hiredate, 6) n_6, NEXT_DAY(hiredate, 7) n_7, NEXT_DAY(hiredate, '금') n_금
FROM emp
WHERE deptno = 10
ORDER BY hiredate DESC
ENAME HIREDATE N_DAY N_6 N_7 N_금
-------------------- -------- -------- -------- -------- --------
MILLER 82/01/23 82/01/29 82/01/29 82/01/30 82/01/29
KING 81/11/17 81/11/20 81/11/20 81/11/21 81/11/20
CLARK 81/06/09 81/06/12 81/06/12 81/06/13 81/06/12
4. LAST_DAY
월의 마지막 날짜를 계산. 윤년, 평년은 자동 계산
사용법> LAST_DAY(date1)
예> LAST_DAY(hiredate) ==> 81-11-30
문제> EMP 테이블에서 입사한 달의 근무 일 수를 계산하여 출력하여라.
단, 토요일과 일요일도 근무 일수에 포함한다.
SELECT empno, ename, hiredate, LAST_DAY(hiredate) l_last,
LAST_DAY(hiredate) - hiredate l_day
FROM emp
WHERE deptno = 10
ORDER BY hiredate DESC
EMPNO ENAME HIREDATE L_LAST L_DAY
----- -------------------- -------- -------- ----------
7934 MILLER 82/01/23 82/01/31 8
7839 KING 81/11/17 81/11/30 13
7782 CLARK 81/06/09 81/06/30 21
5. ROUND 함수
날짜도 반올림이 가능하다. 7개월부터 올림된다고 이해하면 되겠다.
사용법> ROUND(date1 [,fmt])
예> ROUND('99-06-25', 'MONTH') ==> 99-07-01
ROUND('98-06-25', 'YEAR') ==> 98-01-01
6. TRUNC 함수
숫자형 함수와 마찬가지로 명시된 형식으로 절삭한다.
사용법> TRUNC(date1, [,fmt])
예> TRUNC('99-06-25', 'MONTH') ==> 99-06-01
TRUNC('99-06-25', 'YEAR') ==> 99-01-01
문제> EMP 테이블에서 10번 부서 중 입사한 달의 ROUND와 TRUNC 함수를 비교한다.
SELECT ename, hiredate, ROUND(hiredate, 'MONTH') m_round,
TRUNC(hiredate, 'MONTH') m_trunc, ROUND(hiredate, 'YEAR') y_round,
TRUNC(hiredate, 'YEAR') y_trunc
FROM emp
WHERE deptno = 10
ORDER BY hiredate DESC;
ENAME HIREDATE M_ROUND M_TRUNC Y_ROUND Y_TRUNC
-------------------- -------- -------- -------- -------- --------
MILLER 82/01/23 82/02/01 82/01/01 82/01/01 82/01/01
KING 81/11/17 81/12/01 81/11/01 82/01/01 81/01/01
CLARK 81/06/09 81/06/01 81/06/01 81/01/01 81/01/01