프로그래머/SQL(Oracle)

SQL)Oracle_단일행함수/숫자/날짜형함수

FourthWay 2023. 3. 13. 18:53
728x90
반응형

단일 행 함수 - 숫자, 날짜형 함수

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;

 

 

2)부서의 연봉을 계산한다. 단 100단위 미만은 절삭한다

SELECT eno, ename, TRUNC(sal*12+NVL(comm,0), -2) 연봉
FROM emp;

 

--날짜 함수

 

3)현재 시간을 검색하자

ALTER SESSION SET nls_date_format='YYYY/MM/DD/HH24:MI:SS';
ALTER SESSION SET nls_date_format='YYYY/MM/DD';
ALTER SESSION SET nls_date_format='YY/MM/DD';

SELECT sysdate
FROM dual;

 

4)김연아의 
오늘 날짜, 입사 일자, 입사일로부터 오늘까지 기간,
입사일 이후 100일이 지난날 등을 검색하고
날짜 연산의 결과를 보자

 

ALTER SESSION SET nls_date_format='YYYY/MM/DD';

SELECT sysdate 오늘, hdate 입사일, 
      TRUNC(sysdate-hdate) "입사일로부터기간",
      hdate+100 "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) 숫자와 날짜를 절삭하여 출력한다

ALTER SESSION SET nls_date_format='YYYY/MM/DD/HH24:MI:SS';
ALTER SESSION SET nls_date_format='YYYY/MM/DD';
ALTER SESSION SET nls_date_format='YY/MM/DD';

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

 

 

7) 김연아가 오늘까지 일한 일수를 검색한다
입사일을 포함하기 위해 +1을 해줬다
1일 입사
10일 퇴사
10일
10-1 = 9 + 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, 120) "10년 되는 날"
FROM emp
WHERE dno='20';

10) 20번 부서원들이 입사한 이후 첫 번째 일요일을 검색한다
SELECT eno, ename, hdate, NEXT_DAY(hdate, '일요일') Sunday
FROM emp
WHERE dno='20';

11) 20번 부서원들의 입사한 달의 마지막 날짜와
입사한 달에 근무 일수를 검색한다
--(단 입사일은 근무일에서 제외한다)
SELECT eno, ename, hdate, LAST_DAY(hdate) 마지막날,
       LAST_DAY(TRUNC(hdate)) - TRUNC(hdate) "마지막달 근무일수"
FROM emp
WHERE dno='20';

728x90
반응형