2020. 5. 2.

[Oracle] 14. 단일 행 함수 : 숫자, 날짜 함수 정리


숫자 함수

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

함수명
기능        
round
n 자리까지 반올림한다.
round(m,n)
round(123.4567,3) -> 123.456
trunc
n 자리 미만을 절삭한다.
trunc(m,n)
trunc(123.4567,3) -> 123.456
mod
m n으로 나눈 나머지 계산한다.
mod(m, n)
mod(10, 4) -> 2
power
m n 계산한다.
power(m,n)
power(2,4) -> 16
ceil
m보다 가장 작은 정수를 찾는다.
cell(m)
cell(2.34) -> 3
floor
m보다 작은 가장 수를 찾는다.
floor(m)
floor(2.34) -> 2
abs
m 절대 값을 계산한다.
abs(m)
abs(-4) -> 4
sqrt
m 제곱근을 계산한다.
sqrt(m)
sqrt(9) -> 3
sign
m 음수일 -1, 양수일 1, 0이면 0 반환한다.
sign(m)
sign(-3) -> -1

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

select round(98.765), trunc(98.765), round(98.765,2), trunc(98.765,2)
from dual;


select mod(19,3), mod(-19,3) from dual;


select ceil(3.5), floor(3.5) from dual;


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

select eno, ename, trunc(sal*12+nvl(comm,0),-2) 년봉
from emp
where dno='10';


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

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

alter session set nls_date_format = 'YYYY/MM/DD:HH24:MI:SS';


select sysdate from dual;


alter session set nls_date_format = 'YYYY/MM/DD';

select sysdate from dual;


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

select sysdate 오늘, hdate 입사일, trunc(sysdate)-trunc(hdate)+1 근무일, hdate+99 "100"
from emp;


날짜 + 숫자        
날짜
이후 날짜
날짜 - 숫자
날짜
이전 날짜
날짜 + 숫자/24
날짜
시간을 더한 날짜
날짜 - 날짜
숫자
날짜 칸에 (일수)

날짜 함수

함수명
기능        

round
형식에 맞추어 반올림한 날짜를 반환한다.
round(날짜, 형식)
round(sysdate, 'DD') -> 2018/01/02
YYYY : 년도
DD : 날짜
HH : 시간
trunc
형식에 맞추어 절삭한 날짜를 반환한다.
trunc(날짜, 형식)
trunc(sysdate, 'YYYY') -> 2018/01/01
MI :
SS :
months_between
날짜간의 기간을 월수로 계산한다.
months_between(날짜1, 날짜2)
날짜1 > 날짜2 경우 결과는 양수
months_between('2013/09/01','2013/01/01') -> 8

add_months
날짜에 n 달을 더한 날짜를 계산한다.
add_months(날짜, n)
add_months('2011/07/01', 23) -> 2013/06/01

next_day
날짜 이후 지정된 요일에 해당하는 날짜를 계산한다.
next_day(날짜, 요일)
  • 요일 표현은 'sun','일요일', 1 같이 다양한 표현이 가능하다.
next_day('2013/07/14', '일요일') -> 2013/07/21

last_day
날짜를 포함한 달의 마지막 날짜를 계산한다.
last_day(날짜)
last_day('2013/09/24') -> 2013/09/30


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

select sysdate, round(sysdate,'YY'), round(sysdate,'MM'), round(sysdate,'DD') from dual;


select sysdate, trunc(sysdate,'YY'), trunc(sysdate,'MM'), trunc(sysdate,'DD') from dual;


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

select ename, trunc(sysdate)-trunc(hdate)+1 day
from emp
where ename='문시현';


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

select eno, ename, trunc(months_between(sysdate,hdate)) 근무_개월
from emp
where dno = '20';


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

select eno, ename, hdate 입사일, hdate+99 "입사일", add_months(hdate,120) "10"
from emp
where dno = '20';


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

select eno, ename, hdate, next_day(hdate, '일요일') Sunday
from emp
where dno = '20';


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

select eno, ename, hdate, last_day(hdate) 마지막날, last_day(trunc(hdate))-trunc(hdate)+1 "마지막 근무"
from emp
where dno = '20';


실습

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

select pname, hiredate, last_day(hiredate)-hiredate
from professor;

#그달의 마지막 날을 구하려면 last_day 써야한다.


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

select pname, hiredate, trunc((next_day(sysdate, '토요일') - hiredate)/7,0)
from professor;

# sysdate 오늘 날짜를 구한다.
# next_day 이번주의 토요일까지 구한다.
# trunc 소수점 제거
# 7 나눠 계산


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

select pname, hiredate
from professor
where hiredate between '1991/01/01' and '1995/12/31';


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

select sname, trunc((avr/4*4.5),2)
from student;

# 소수점 제한해주는 trunc 함수 사용 2번째자리까지만 사용


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

select ename, sal/(last_day(hdate)-trunc(hdate,'MM')+1)*(last_day(hdate)-hdate+1)
from emp;

# (last_day(hdate)-hdate+1) 그달 마지막일수 - 입사일 + 1
# (last_day(hdate)-trunc(hdate,'MM')+1) 그달 마지막일수 - 입사일 달단위로 버림 처리 +1


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

select ename, hdate, trunc((sysdate - hdate)/365,0) , trunc(months_between(sysdate,hdate),0) , trunc(sysdate-hdate,0)
from emp;




댓글 없음:

댓글 쓰기