▶ 숫자 함수
숫자 함수는 숫자를 인자로 사용하고 결과 값도 숫자를 반환하는 함수이다.
예제 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;
'SQL 공부 기록' 카테고리의 다른 글
DB 1 - 데이터베이스 및 데이터 모델 (0) | 2021.11.17 |
---|---|
SQL 15 - 단일 행 함수 : 변환 함수 (0) | 2021.11.16 |
SQL 13 - 단일 행 함수 : 문자 함수 (0) | 2021.11.12 |
SQL 12 - 집합 연산자 (0) | 2021.11.12 |
SQL 11 - 서브 쿼리 : 다중 행, 다중 열 서브 쿼리 (0) | 2021.11.09 |