본문 바로가기
DB/Oracle SQL Developer

<25, 26> 단일행 함수 - 숫자, 날짜형 함수

by 코딩 뉴비 2020. 12. 2.
단일 행 함수 - 숫자, 날짜형 함수

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;

댓글