▶ 숫자 함수

숫자 함수는 숫자를 인자로 사용하고 결과 값도 숫자를 반환하는 함수이다.

예제 1. 다양한 숫자 함수를 이용한 결과를 확인한다.

SELECT ROUND(98.765), TRUNC(98.765),
ROUND(98.765,2), TRUNC(98.765,2)
FROM dual;

ROUND(98.765) TRUNC(98.765) ROUND(98.765,2) TRUNC(98.765,2)
------------- ------------- --------------- ---------------
           99            98           98.77           98.76
           

SELECT MOD(19,3), MOD(-19,3)
FROM dual;

 MOD(19,3) MOD(-19,3)
---------- ----------
         1         -1
         

SELECT CEIL(3.5), FLOOR(3.5)
FROM dual;

 CEIL(3.5) FLOOR(3.5)
---------- ----------
         4          3

 

예제 2. 10번 부서의 년봉을 계산한다. 단 100 단위 미만은 절삭한다.

SELECT eno, ename, TRUNC(sal*12+NVL(comm,0),-2) 년봉
FROM emp
WHERE dno='10';

ENO     ENAME            년봉
------- ---------- ----------
1001    문시현          54500
2001    남궁연호        47600
3001    김선유          38700
0269    권나현          33100
0401    김진성          39400

 

 

▶ 날짜 함수와 날짜 연산의 이해

예제 3. 현재 날짜를 검색하고 날짜 출력 양식을 수정해 보자.

ALTER SESSION SET nls_date_format = 'YYYY/MM/DD:HH24:MI:SS';
SELECT sysdate FROM dual;

SYSDATE
-------------------
2021/11/15:16:47:44


ALTER SESSION SET nls_date_format = 'YYYY/MM/DD';
SELECT sysdate FROM dual;

SYSDATE
----------
2021/11/15

 

예제 4. 오늘 날짜, 입사 일자, 입사일로부터 오늘까지 기간, 입사일 이후 100째 되는날 등을 검색하고 날짜 연산의 결과를 살펴보자.

SELECT sysdate 오늘, hdate 입사일,
TRUNC(sysdate)-TRUNC(hdate)+1 근무일, hdate+99 "100일"
FROM emp;

오늘       입사일         근무일 100일
---------- ---------- ---------- ----------
2021/11/15 1991/01/01      11277 1991/04/10
2021/11/15 1991/02/01      11246 1991/05/11
2021/11/15 1991/12/01      10943 1992/03/09
2021/11/15 1992/02/01      10881 1992/05/10
2021/11/15 1991/03/02      11217 1991/06/09
2021/11/15 1991/02/01      11246 1991/05/11
2021/11/15 1992/03/03      10850 1992/06/10

 

※ 날짜 함수

 

예제 5. 숫자와 날짜를 반올림하거나 잘라내고 출력해본다.

SELECT sysdate, ROUND(sysdate,'YY') 년,
ROUND(sysdate,'MM') 월,
ROUND(sysdate,'DD') 일
FROM dual;

SYSDATE    년         월         일
---------- ---------- ---------- ----------
2021/11/15 2022/01/01 2021/11/01 2021/11/16

SELECT sysdate, TRUNC(sysdate,'YY') 년,
TRUNC(sysdate,'MM') 월,
TRUNC(sysdate,'DD') 일
FROM dual;

SYSDATE    년         월         일
---------- ---------- ---------- ----------
2021/11/15 2021/01/01 2021/11/01 2021/11/15

 

예제 6. 문시현이 오늘까지 일한 일수를 검색한다.

SELECT ename, TRUNC(sysdate)-TRUNC(hdate)+1 DAY
FROM emp
WHERE ename='문시현';

ENAME             DAY
---------- ----------
문시현          11246

 

예제 7. 20번 부서 직원들이 현재까지 근무한 개월 수를 검색한다.

SELECT eno, ename, TRUNC(MONTHS_BETWEEN(sysdate,hdate)) 근무_개월
FROM emp
WHERE dno = '20';

ENO     ENAME       근무_개월
------- ---------- ----------
1002    김주란            356
2002    제갈민            306
3002    권아현            249
0120    김경현            266

 

예제 8. 20번 부서원들이 입사 100일째 되는 날과 10년째 되는 날을 검색한다.

SELECT eno, ename, hdate 입사일,
hdate+99 "100일", ADD_MONTHS(hdate,120) "10년"
FROM emp
WHERE dno = '20';

ENO     ENAME      입사일     100일      10년
------- ---------- ---------- ---------- ----------
1002    김주란     1992/03/03 1992/06/10 2002/03/03
2002    제갈민     1996/04/30 1996/08/07 2006/04/30
3002    권아현     2001/01/29 2001/05/08 2011/01/29
0120    김경현     1999/09/05 1999/12/13 2009/09/05

 

예제 9. 20번 부서원들이 입사한 이후 첫 번째 일요일을 검색한다.

SELECT eno, ename, hdate, NEXT_DAY(hdate,'일요일') Sunday
FROM emp
WHERE dno = '20';

ENO     ENAME      HDATE      SUNDAY
------- ---------- ---------- ----------
1002    김주란     1992/03/03 1992/03/08
2002    제갈민     1996/04/30 1996/05/05
3002    권아현     2001/01/29 2001/02/04
0120    김경현     1999/09/05 1999/09/12

 

예제 10. 20번 부서원들의 입사한 달의 마지막 날짜와 입사한 달에 근무 일수를 검색한다.

SELECT eno, ename, hdate, LAST_DAY(hdate) 마지막날,
LAST_DAY(TRUNC(hdate))-TRUNC(hdate)+1 "마지막달 근무일수"
FROM emp
WHERE dno = '20';

ENO     ENAME      HDATE      마지막날   마지막달 근무일수
------- ---------- ---------- ---------- -----------------
1002    김주란     1992/03/03 1992/03/31                29
2002    제갈민     1996/04/30 1996/04/30                 1
3002    권아현     2001/01/29 2001/01/31                 3
0120    김경현     1999/09/05 1999/09/30                26

 

실습 (모두 단일 행 함수를 이용한다.)

1. 교수들이 부임한 달에 근무한 일수는 몇 일인지 검색한다.

SELECT pno 교수번호, pname 교수이름, hiredate 부임일자, 
	LAST_DAY(TRUNC(hiredate))-TRUNC(hiredate)+1 근무일수
FROM professor;

교수번호  교수이름   부임일자     근무일수
--------- ---------- ---------- ----------
1001      송강       2002/08/12         20
1004      시진영     1991/02/01         28
1006      장청아     2003/05/20         12
1007      이초아     2010/07/06         26
1008      문규식     2005/02/11         18
1010      이규진     1998/10/07         25
1009      이준영     1991/10/04         28


2. 교수들의 오늘까지 근무한 주가 몇 주인지 검색한다.

SELECT pno 교수번호, pname 교수이름, hiredate 부임일자, 
	TRUNC((TRUNC(sysdate)-TRUNC(hiredate)+1)/7,0) 근무주수 // 근무일수/7일 한 후 버림
FROM professor;

교수번호  교수이름   부임일자     근무주수
--------- ---------- ---------- ----------
1001      송강       2002/08/12       1005
1004      시진영     1991/02/01       1606
1006      장청아     2003/05/20        965
1007      이초아     2010/07/06        593
1008      문규식     2005/02/11        874
1010      이규진     1998/10/07       1205
1009      이준영     1991/10/04       1571


3. 1991년에서 1995년 사이에 부임한 교수를 검색한다.

SELECT pno 교수번호, pname 교수이름, hiredate 부임일자
FROM professor
WHERE hiredate BETWEEN '1991/01/01' AND '1995/12/31';

교수번호  교수이름   부임일자
--------- ---------- ----------
1004      시진영     1991/02/01
1009      이준영     1991/10/04
1036      성현수     1993/07/13
1031      김서령     1991/10/09


4. 학생들의 4.5 환산 평점을 검색한다. (단 소수 이하 둘째 자리까지)

SELECT sno, sname, avr "4.0 평점", TRUNC(avr*4.5/4, 2) "4.5 평점"
FROM student;

SNO     SNAME        4.0 평점   4.5 평점
------- ---------- ---------- ----------
915301  정동상            .95       1.06
905301  유태지           3.28       3.69
905302  정욱상           1.44       1.62
915303  정욱주            .95       1.06
923903  정남윤           3.23       3.63
923904  한현석           2.45       2.75
933901  김용서           1.48       1.66


5. 사원들이 일한 날짜에 대해서만 급여를 받는다면 급여가 현재와 동일하다는 조건에서 입사한 달에 급여는 얼마나 지급되었을지 검색한다.

수정중------------

SELECT eno 사번, ename 이름, sal 급여, hdate 입사일, (LAST_DAY(TRUNC(hdate))-TRUNC(hdate)+1)"입사한달 급여"
FROM emp;

//(LAST_DAY(TRUNC(hdate))-TRUNC(hdate)+1) 입사한 달 일수


6. 사원들의 오늘까지 근무 기간이 몇 년 몇 개월 몇 일인지 검색한다.

수정중------------

SELECT eno 사번, ename 이름, hdate 입사일, 
  '근무기간: '||TRUNC((MONTHS_BETWEEN(sysdate, hdate))/12)||'년 '||
  TRUNC(MONTHS_BETWEEN(sysdate, hdate))-TRUNC((MONTHS_BETWEEN(sysdate, hdate))/12)*12||'개월 '||
  ||'일'
FROM emp;

 

+ Recent posts