단일 행 함수 - 숫자, 날짜형 함수
ROUND : 그냥 쓰면 소수점을 반올림해서 정수로
ROUND(m, n)
n자리까지 반올림한다
ROUND(123.4567, 3) => 123.457
TRUNC : TRUNC(m, n)
n자리 미만을 절삭한다
TRUNC(123.4567, 3) => 123.456
MOD : MOD(m, n)
m을 n으로 나눈 나머지 계산한다
MOD(10, 4) => 2
POWER : POWER(m, n)
m의 n승 계산한다
POWER(2, 4) => 16
CEIL : CEIL(m)
m보다 큰 가장 작은 정수를 찾는다
CEIL(2.34) => 3
FLOOR : FLOOR(m)
m보다 작은 가장 큰 수를 찾는다
FLOOR(2.34) => 2
ABS : ABS(m)
m의 절대값을 계산한다
ABS(-4) => 4
SQRT : SQRT(m)
m의 제곱근을 계산한다
SQRT(9) => 3
SIGN : SIGN(m)
m이 음수일 때 -1, 양수일 때 1, 0이면 0을 반환
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;
2)부서의 연봉을 계산한다. 단 100단위 미만은 절삭한다
SELECT eno, ename, TRUNC(sal*12+NVL(comm, 0), -2) 연봉
-- 2: _ _. _ _ : 소수점 둘쨰자리까지
-- -2 : _ _. : 소수점부터 십의자리까지
FROM emp;
--WHERE dno='10';
--날짜 함수
3)현재 시간을 검색하자
ALTER SESSION SET nls_date_format='YYYY/MM/DD:HH24:MI:SS';
SELECT sysdate
FROM dual;
4)김연아의
오늘 날짜, 입사 일자, 입사일로부터 오늘까지 기간,
입사일 이후 100일이 지난날 등을 검색하고
날짜 연산의 결과를 보자
ALTER SESSION SET nls_date_format='YY/MM/DD';
SELECT sysdate, hdate, TRUNC(sysdate-hdate), hdate+100
FROM emp
WHERE ename ='김연아';
날짜 + 숫자 = 날짜(일수 이후 날짜)
날짜 - 숫자 = 날짜(일수 이전 날짜)
날짜 + 숫자/24 = 날짜 (시간을 더한 날짜)
날짜 - 날짜 = 숫자 (두 날짜 간에 차(일수))
날짜 함수는 주로 회계 정산시 많이 사용한다
ERP 솔루션, SI 회계
YYYY : 년도
MM : 월
DD : 날짜
HH : 시간
MI : 분
SS : 초
ROUND : ROUND(날짜, 형식)
형식에 맞추어 반올림한 날짜를 반환한다
ROUND(sysdate, 'DD') => 2020/02/26
TRUNC : TRUNC(날짜, 형식)
형식에 맞추어 절삭한 날짜를 반환한다
TRUNC(sysdate, 'YYYY') => 2020/01/01
MONTHS_BETWEEN : MONTHS_BETWEEN(날짜1, 날짜2)
두 날짜간의 기간을 월 수로 계산한다
MONTHS_BETWEEN('2020/03/01', '2020/04/01')
=> 1
ADD_MONTHS : ADD_MONTHS(날짜, n);
날짜에 n달을 더한 날짜를 계산한다
ADD_MONTHS('2020/03/01', 23)
=> '2022/02/01'
NEXT_DAY : NEXT_DAY(날짜, 요일)
날짜 이후 지정된 요일에 해당하는 날짜를 계산
요일 표현은 'sun', '일요일', 1과 같이
다양한 표현이 가능하다
LAST_DAY : LAST_DAY(날짜)
날짜를 포함한 달의 마지막 날짜를 계산
LAST_DAY('2020/02/25') => 2020/02/29
5) 숫자와 날짜를 반올림하여 출력한다
SELECT sysdate, ROUND(sysdate, 'YY') 년,
ROUND(sysdate, 'MM')월,
ROUND(sysdate, 'DD')일
FROM dual;
6) 숫자와 날짜를 절삭하여 출력한다
SELECT sysdate, TRUNC(sysdate, 'YY') 년,
TRUNC(sysdate, 'MM')월,
TRUNC(sysdate, 'DD')일
FROM dual;
7) 김연아가 오늘까지 일한 일수를 검색한다
입사일을 포함하기 위해 +1을 해줬다
SELECT TRUNC(sysdate, 'DD') - TRUNC(hdate, 'DD')+1 "일한 날"
FROM emp
WHERE ename='김연아';
8) 20번 부서 직원들이 현재까지 근무한 개월 수를 검색한다
SELECT eno, ename, TRUNC(MONTHS_BETWEEN(sysdate, hdate)) 근무개월
FROM emp
WHERE dno='20';
9) 20번 부서원들이 입사 100일째 되는 날과 10년째 되는 날을 검색한다
SELECT eno, ename, hdate 입사일,
hdate+99 "입사 100일째",
ADD_MONTHS(hdate, 10*12) "입사 10년째 되는 날"
FROM emp
WHERE dno ='20';
10) 20번 부서원들이 입사한 이후 첫 번째 일요일을 검색한다
SELECT eno, ename, hdate, NEXT_DAY(hdate, '일요일') "입사 후 첫 일요일"
FROM emp
WHERE dno='20';
11) 20번 부서원들의 입사한 달의 마지막 날짜와
입사한 달에 근무 일수를 검색한다
(단 입사일은 근무일에서 제외한다) -- +1하면 안됨..
SELECT eno, ename, hdate, LAST_DAY(hdate) "입사한 달 마지막 날짜",
LAST_DAY(TRUNC(hdate))-TRUNC(hdate) "입사한 달 근무일수"
--
FROM emp
WHERE dno='20';
연습문제
<단일 행 함수를 이용하세요>
1) 교수들이 부임한 달에 근무한 일수는 몇 일인지 검색하세요
SELECT pno, pname, hiredate, LAST_DAY(TRUNC(hiredate))-TRUNC(hiredate)+1 "부임한 달 근무 일수"
FROM professor ;
2) 교수들의 오늘까지 근무한 주가 몇 주인지 검색하세요
SELECT pno, pname, TRUNC((sysdate-hiredate)/7)
FROM professor;
3) 1991년에서 1995년 사이에 부임한 교수를 검색하세요
ALTER SESSION SET nls_date_format='YYYY/MM/DD HH24:MI:SS';
SELECT pno, pname, hiredate
FROM professor
--TO_DATE(1991, 'YYYY') : 1991/12/01 디폴트값임
--TRUNC(hiredate, 'YYYY') : 년도 이하는 1월 1일로 초기화시킴
WHERE TO_DATE('1991/01/01', 'YYYY/MM/DD') <= TRUNC(hiredate, 'YYYY')
AND TO_DATE('1996/01/01', 'YYYY/MM/DD') > TRUNC(hiredate, 'YYYY')
-- AND TRUNC(hiredate) BETWEEN '' AND ''
ORDER BY hiredate;
4) 학생들의 4.5 환산 평점을 검색하세요(단 소수 이하 둘째자리까지)
SELECT sno, sname, TO_CHAR(avr*1.125, '0.99')
FROM student;
'DB > Oracle SQL Developer' 카테고리의 다른 글
<29, 30> GROUP (0) | 2020.12.02 |
---|---|
<27, 28> 단일행 함수 - 변환함수 (0) | 2020.12.02 |
<23, 24> 단일행 함수 - 문자함수 (0) | 2020.12.02 |
<21, 22> JOIN ~ON 절 / 좌우 외부 조인 (Left Right Outer Join) (0) | 2020.12.02 |
<19, 20> Natural Join / Using Join (0) | 2020.12.02 |
댓글