학습 과정 공유 및 후기/SQLD

[ SQLD ] Oracle SQL (4) - 숫자함수, 날짜 함수

커피마시는어린왕자 2020. 5. 20. 16:24

이번에는 Oracle SQL에서 숫자함수에 대해 알아보자.

 

1. 숫자 함수

 

1) ROUND (숫자, 소수점을 기준으로 출력을 원하는 자리수) : 반올림

 

 

2) TRUNC (숫자, 소수점을 기준으로 버림을 원하는 자리수) : 버림

* TRUNC(숫자)만 적어도 무방. 버림을 원하는 자리수의 기본값이 0.

 

 

3) MOD (숫자, 나눌 숫자) : 나머지 값

 

 

4) CEIL(숫자) : 주어진 숫자의 가장 가까운 큰 정수를 구함

 

 

5) FLOOR(숫자) : 주어진 숫자의 가장 가까운 작은 정수를 구함

 

 

6) POWER (숫자 1의, 숫자2의 승수)

 

 

 

2. 날짜 함수

 

1. SYSDATE 함수: 서버의 현재 날짜와 시간

SYSDATE
--------
20/05/20
더보기
SELECT SYSDATE FROM DUAL;

 

1-2. SYSTIMESTAMP : 서버의 현재 날짜와 시간 TIMEZONE 값을 리턴

 

SYSTIMESTAMP
---------------------------------------------------------------------------
20/05/20 16:29:48.311000 +09:00
더보기
SQL> SELECT SYSTIMESTAMP FROM DUAL;

 

 

1-3. CURRENT_DATE : 세션 시간대의 현재 날짜를 리턴한다.

CURRENT_DATE
------------
20/05/20
더보기
SQL> SELECT CURRENT_DATE FROM DUAL;

 

* 세션이란?

클라이언트가 서버에 접속을 하게 되면 서버는 클라이언트의 정보를 담는 객체를 생성해서 서버에서 관리를 하게 된다.

이때 서버가 관리하는 객체가 세션이고, 클라이언트에 저장되는 객체는 쿠키이다.

 

 

1-4. CURRENT_TIMESTAMP : 세션 시간대의 TIMEZONE값을 내장하고 리턴한다.

 

CURRENT_TIMESTAMP
---------------------------------------------------------------------------
20/05/20 16:32:42.947000 +09:00
더보기
SQL> SELECT CURRENT_TIMESTAMP FROM DUAL;

1-5. EXTRACT(DATETIME) : () 안에 있는 데이터 필드를 추출한다.

 

// SYSDATE(현재 날짜와 시간)으로부터 YEAR(연도)만 추출하겠다

ENAME                EXTRACT(YEARFROMSYSDATE)
-------------------- ------------------------
SMITH                                    2020
ALLEN                                    2020
WARD                                     2020
JONES                                    2020
MARTIN                                   2020
BLAKE                                    2020
CLARK                                    2020
KING                                     2020
TURNER                                   2020
JAMES                                    2020
FORD                                     2020

ENAME                EXTRACT(YEARFROMSYSDATE)
-------------------- ------------------------
MILLER                                   2020
더보기
SQL> SELECT ENAME, EXTRACT(YEAR FROM SYSDATE) FROM EMP;

 

2. MONTHS_BETWEEN(큰 날짜, 작은 날짜)

: 두 날짜 사이의 개월 수를 출력 (큰 날자를 먼저 써야 양수가 나옴) - 윤달을 구분하지 못한다.

 

Q. 사원 테이블에서 현재가지의 근무일수가 몇 주 몇 일인지 출력해보자

ENAME                HIREDATE SYSDATE  TOTAL_DAYS      WEEKS       DAYS
-------------------- -------- -------- ---------- ---------- ----------
SMITH                80/12/17 20/05/21  14400.393       2057          1
ALLEN                81/02/20 20/05/21  14335.393       2047          6
WARD                 81/02/22 20/05/21  14333.393       2047          4
JONES                81/04/02 20/05/21  14294.393       2042          0
MARTIN               81/09/28 20/05/21  14115.393       2016          3
BLAKE                81/05/01 20/05/21  14265.393       2037          6
CLARK                81/06/09 20/05/21  14226.393       2032          2
KING                 81/11/17 20/05/21  14065.393       2009          2
TURNER               81/09/08 20/05/21  14135.393       2019          2
JAMES                81/12/03 20/05/21  14049.393       2007          0
FORD                 81/12/03 20/05/21  14049.393       2007          0

ENAME                HIREDATE SYSDATE  TOTAL_DAYS      WEEKS       DAYS
-------------------- -------- -------- ---------- ---------- ----------
MILLER               82/01/23 20/05/21  13998.393       1999          5
더보기
SQL> select ename, hiredate, sysdate, (sysdate-hiredate) as total_days, trunc((sysdate-hiredate)/7) as weeks,round(mod(sysdate-hiredate,7), 0) as days from emp;

 

 

Q. 사원테이블에서 10번 부서의 현재가지의 근무 월수를 계산해서 출력하자 (months_between 사용)

ENAME                HIREDATE SYSDATE   M_BETWEEN  T_BETWEEN
-------------------- -------- -------- ---------- ----------
CLARK                81/06/09 20/05/21 467.399839        467
KING                 81/11/17 20/05/21 462.141775        462
MILLER               82/01/23 20/05/21 459.948226        459
더보기
SQL> select ename, hiredate, sysdate, months_between(sysdate,hiredate) as M_Between, trunc(months_between(sysdate,hiredate)) as T_Between from emp
  2  where deptno = 10;

 

 

 

3. ADD_MONTHS ( 날짜, 추가를 원하는 개월수)

 

Q. 사원 테이블에서 10번 부서원의 입사 일자로부터 5개월이 지난 후 날짜를 계산하여 출력하자 (add_months 사용)

ENAME                HIREDATE A_MONTH
-------------------- -------- --------
CLARK                81/06/09 20/10/21
KING                 81/11/17 20/10/21
MILLER               82/01/23 20/10/21
더보기
SQL> select ename, hiredate, add_months(sysdate,5) as A_Month from emp
  2  where deptno = 10;

 

 

4. LAST_DAY(날짜) : 주어진 날짜가 속한 달의 마지막 날짜 출력

 

Q. 사원 테이블에서 입사한 달의 근무 일수를 계산하여 조회한다.

단, 토요일과 일요일도 근무일수에 포함한다. (last_day 사용) -> 해당 월의 마지막 날짜를 리턴

ENAME                SYSDATE  NEXT_DAY
-------------------- -------- --------
MILLER               20/05/21 20/05/22
KING                 20/05/21 20/05/22
CLARK                20/05/21 20/05/22

 

 

5. NEXT_DAY(날짜,'요일') : 주어진 날짜를 기준으로 돌아오는 가장 최근 요일의 날짜를 반환

 

- 윈도우용 오라클에서는 '수'처럼 한글로 써야 함. + '일요일~토요일'이 1~7까지 대응

- 리눅스용 오라클에서는 'WED'처럼 영어로 써야 한다.

 

Q. 사원 테이블에서 10번 부서원의 입사일자로부터 돌아오는 금요일을 계산하여 조회하자 (next_day 사용)

ENAME                SYSDATE  NEXT_DAY
-------------------- -------- --------
MILLER               20/05/21 20/05/22
KING                 20/05/21 20/05/22
CLARK                20/05/21 20/05/22
더보기
SQL> select ename, sysdate, next_day(sysdate,6) from emp
  2  where deptno = 10
  3  order by hiredate desc;
  
  
// 한글로 '금요일' 해도 무방
SQL> select ename, sysdate, next_day(hiredate, '금요일') from emp
  2  where deptno = 10;

 

6. ROUND(날짜) : 주어진 날짜가 낮 12:00:00을 넘어설 경우 다음 날짜로 출력하고, 이 시간이 안 될 경우 당일로 출력

 

+) '월(month)'을 반올림하는 경우 - 15이상이면 다음달 1일을 출력, 넘지 않으면 현재 달 1일을 출력한다.

 

+) '연도(year)'을 반올림하는 경우 - 6월을 넘으면 다음해 1월1일을 출력하고, 아니라면 그 해 1월 1일을 출력

 

 

 

7. TRUNC(날짜) : 주어진 날짜를 무조건 당일로 처리