[ SQLD ] Oracle SQL (4) - 숫자함수, 날짜 함수
이번에는 Oracle SQL에서 숫자함수에 대해 알아보자.
1. 숫자 함수
1) ROUND (숫자, 소수점을 기준으로 출력을 원하는 자리수) : 반올림
2) TRUNC (숫자, 소수점을 기준으로 버림을 원하는 자리수) : 버림
* TRUNC(숫자)만 적어도 무방. 버림을 원하는 자리수의 기본값이 0.
3) MOD (숫자, 나눌 숫자) : 나머지 값
4) CEIL(숫자) : 주어진 숫자의 가장 가까운 큰 정수를 구함
5) FLOOR(숫자) : 주어진 숫자의 가장 가까운 작은 정수를 구함
6) POWER (숫자 1의, 숫자2의 승수)
2. 날짜 함수
1. SYSDATE 함수: 서버의 현재 날짜와 시간
SYSDATE
--------
20/05/20
SELECT SYSDATE FROM DUAL;
1-2. SYSTIMESTAMP : 서버의 현재 날짜와 시간 TIMEZONE 값을 리턴
SYSTIMESTAMP
---------------------------------------------------------------------------
20/05/20 16:29:48.311000 +09:00
SQL> SELECT SYSTIMESTAMP FROM DUAL;
1-3. CURRENT_DATE : 세션 시간대의 현재 날짜를 리턴한다.
CURRENT_DATE
------------
20/05/20
SQL> SELECT CURRENT_DATE FROM DUAL;
* 세션이란?
클라이언트가 서버에 접속을 하게 되면 서버는 클라이언트의 정보를 담는 객체를 생성해서 서버에서 관리를 하게 된다.
이때 서버가 관리하는 객체가 세션이고, 클라이언트에 저장되는 객체는 쿠키이다.
1-4. CURRENT_TIMESTAMP : 세션 시간대의 TIMEZONE값을 내장하고 리턴한다.
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
20/05/20 16:32:42.947000 +09:00
SQL> SELECT CURRENT_TIMESTAMP FROM DUAL;
1-5. EXTRACT(DATETIME) : () 안에 있는 데이터 필드를 추출한다.
// SYSDATE(현재 날짜와 시간)으로부터 YEAR(연도)만 추출하겠다
ENAME EXTRACT(YEARFROMSYSDATE)
-------------------- ------------------------
SMITH 2020
ALLEN 2020
WARD 2020
JONES 2020
MARTIN 2020
BLAKE 2020
CLARK 2020
KING 2020
TURNER 2020
JAMES 2020
FORD 2020
ENAME EXTRACT(YEARFROMSYSDATE)
-------------------- ------------------------
MILLER 2020
SQL> SELECT ENAME, EXTRACT(YEAR FROM SYSDATE) FROM EMP;
2. MONTHS_BETWEEN(큰 날짜, 작은 날짜)
: 두 날짜 사이의 개월 수를 출력 (큰 날자를 먼저 써야 양수가 나옴) - 윤달을 구분하지 못한다.
Q. 사원 테이블에서 현재가지의 근무일수가 몇 주 몇 일인지 출력해보자
ENAME HIREDATE SYSDATE TOTAL_DAYS WEEKS DAYS
-------------------- -------- -------- ---------- ---------- ----------
SMITH 80/12/17 20/05/21 14400.393 2057 1
ALLEN 81/02/20 20/05/21 14335.393 2047 6
WARD 81/02/22 20/05/21 14333.393 2047 4
JONES 81/04/02 20/05/21 14294.393 2042 0
MARTIN 81/09/28 20/05/21 14115.393 2016 3
BLAKE 81/05/01 20/05/21 14265.393 2037 6
CLARK 81/06/09 20/05/21 14226.393 2032 2
KING 81/11/17 20/05/21 14065.393 2009 2
TURNER 81/09/08 20/05/21 14135.393 2019 2
JAMES 81/12/03 20/05/21 14049.393 2007 0
FORD 81/12/03 20/05/21 14049.393 2007 0
ENAME HIREDATE SYSDATE TOTAL_DAYS WEEKS DAYS
-------------------- -------- -------- ---------- ---------- ----------
MILLER 82/01/23 20/05/21 13998.393 1999 5
SQL> select ename, hiredate, sysdate, (sysdate-hiredate) as total_days, trunc((sysdate-hiredate)/7) as weeks,round(mod(sysdate-hiredate,7), 0) as days from emp;
Q. 사원테이블에서 10번 부서의 현재가지의 근무 월수를 계산해서 출력하자 (months_between 사용)
ENAME HIREDATE SYSDATE M_BETWEEN T_BETWEEN
-------------------- -------- -------- ---------- ----------
CLARK 81/06/09 20/05/21 467.399839 467
KING 81/11/17 20/05/21 462.141775 462
MILLER 82/01/23 20/05/21 459.948226 459
SQL> select ename, hiredate, sysdate, months_between(sysdate,hiredate) as M_Between, trunc(months_between(sysdate,hiredate)) as T_Between from emp
2 where deptno = 10;
3. ADD_MONTHS ( 날짜, 추가를 원하는 개월수)
Q. 사원 테이블에서 10번 부서원의 입사 일자로부터 5개월이 지난 후 날짜를 계산하여 출력하자 (add_months 사용)
ENAME HIREDATE A_MONTH
-------------------- -------- --------
CLARK 81/06/09 20/10/21
KING 81/11/17 20/10/21
MILLER 82/01/23 20/10/21
SQL> select ename, hiredate, add_months(sysdate,5) as A_Month from emp
2 where deptno = 10;
4. LAST_DAY(날짜) : 주어진 날짜가 속한 달의 마지막 날짜 출력
Q. 사원 테이블에서 입사한 달의 근무 일수를 계산하여 조회한다.
단, 토요일과 일요일도 근무일수에 포함한다. (last_day 사용) -> 해당 월의 마지막 날짜를 리턴
ENAME SYSDATE NEXT_DAY
-------------------- -------- --------
MILLER 20/05/21 20/05/22
KING 20/05/21 20/05/22
CLARK 20/05/21 20/05/22
5. NEXT_DAY(날짜,'요일') : 주어진 날짜를 기준으로 돌아오는 가장 최근 요일의 날짜를 반환
- 윈도우용 오라클에서는 '수'처럼 한글로 써야 함. + '일요일~토요일'이 1~7까지 대응
- 리눅스용 오라클에서는 'WED'처럼 영어로 써야 한다.
Q. 사원 테이블에서 10번 부서원의 입사일자로부터 돌아오는 금요일을 계산하여 조회하자 (next_day 사용)
ENAME SYSDATE NEXT_DAY
-------------------- -------- --------
MILLER 20/05/21 20/05/22
KING 20/05/21 20/05/22
CLARK 20/05/21 20/05/22
SQL> select ename, sysdate, next_day(sysdate,6) from emp
2 where deptno = 10
3 order by hiredate desc;
// 한글로 '금요일' 해도 무방
SQL> select ename, sysdate, next_day(hiredate, '금요일') from emp
2 where deptno = 10;
6. ROUND(날짜) : 주어진 날짜가 낮 12:00:00을 넘어설 경우 다음 날짜로 출력하고, 이 시간이 안 될 경우 당일로 출력
+) '월(month)'을 반올림하는 경우 - 15이상이면 다음달 1일을 출력, 넘지 않으면 현재 달 1일을 출력한다.
+) '연도(year)'을 반올림하는 경우 - 6월을 넘으면 다음해 1월1일을 출력하고, 아니라면 그 해 1월 1일을 출력
7. TRUNC(날짜) : 주어진 날짜를 무조건 당일로 처리