DB_SQL_단일행함수02

BBBeom·2022년 8월 8일

DB

목록 보기
6/18

숫자 함수

  1. ROUND -> 자주쓰임★
    지정된 숫자의 특정위치에서 반올림한 값을 반환

  2. TRUNC
    지정된 숫자의 특정 위치에서 버림한 값을 반환

  3. CEIL / FLOOR
    지정된 숫자보다 큰(작은) 정수 중 가장 작은(큰) 수를 반환

  4. MOD
    지정된 숫자를 나눈후 나머지 값을 반환

1. ROUND 함수

소수점 자리수를 지정하기 위해서 사용한다
특정 소수점을 반올림하고 나머지를 버리는 함수다
(자바의 %.3f 같은 느낌이다)

ROUND(숫자값, 자리수)

SELECT ROUND(1234.5678)
SELECT ROUND(1234.5678, 0)

둘다 소수점 첫번째 자리수를 반올림한다
값은 1235, 1235 가 나온다
0자리에 2가 들어가면 1234.57이 나온다

이 자리수는 음수값도 올수가있는데

SELECT ROUND(1234.5678)
SELECT ROUND(1234.5678, -2)

자연수 두번째 자리인 30을 반올림한다
1200이 나오게 된다

  • ROUND (동그랗다) 직역해서 이해해보면 숫자가
    길게 늘어져 있으면 동그랗게 다듬어준다 라는 뜻으로 느껴진다

2. TRUNC 함수

소수점 버림 및 날짜의 시간을 지울때 주로사용

TRUNC('값', '옵션')

SELECT TRUNC(날짜시간데이터)
데이터가 날짜와 시간이 있을경우 시간에 해당되는 값을 0으로 만들고 리턴

SELECT TRUNC('날짜시간')          /*모든 시간을 0으로*/
FROM DUAL;

SELECT TRUNC('날짜시간', 'DD')	 /*모든 시간을 0으로(DEFAULT값과 같은결과)*/
SELECT TRUNC('날짜시간', 'HH24')  /*분, 초를 0으로*/
SELECT TRUNC('날짜시간', 'MI')    /*초를 0으로*/
FROM DUAL;

SELECT TRUNC(숫자데이터, 자릿수)
컬럼의 데이터가 숫자면 소숫점을 전부 버리고 리턴한다

SELECT TRUNC(1234.5678)		/*모든 소수점 절사*/
FROM DUAL;

SELECT TRUNC(1234.5678, 3)  /*소수점 3째자리 까지 절사*/
							/*(1234.567)*/
  
SELECT TRUNC(1234.5678, -2) /*정수부분 2째자리 까지 절사*/
  							/*(1200)*/

자릿수가 없을경우엔 DEFAULT값인 0으로 처리(모든 소숫점 버림)
자릿수가 음수일경우엔 정수부분도 버림 처림(-2일경우 10의 자리수까지 버림)

3. CEIL / FLOOR 함수

CEIL(숫자) 함수
소수점 첫째자리에서 올림하는 함수

FLOOR(숫자) 함수
소수점 첫째자리에서 버림하는 함수

ROUND함수와 다르게
CEIL, FLOOR 둘다 자리수를 지정할 수 없다

반올림이 아닌 올림과 버림을 하고 싶을때 사용하면 된다

SELECT
CEIL(1234.5678),
FLOOR(1234.5678)
FROM DUAL;

TRUNC 함수는 버림의 자리수를 지정해야할때 사용
FLOOR 함수는 그냥 소수점 자리수를 버릴때 사용

4. MOD 함수

자바에서 % 연산자 처럼 값을 나눈후 나머지값을 리턴해준다

SELECT MOD(숫자1, 숫자2)
FROM DUAL;

숫자1을 숫자2로 나눈다음 나머지값을 RETURN 한다

날짜 함수

우선 날짜함수는 +, - 연산을 할 수 있는데
헷갈리지 않게 잘 사용해야 한다

가장 미래의 날짜가 가장 큰 날짜라고 생각하고
가장 과거의 날짜가 가장 작은 날짜라고 생각하면 된다

1. SYSDATE 함수

별다른 입력데이터 없이 현재 DBMS가 설치된 OS의 현재 날짜와 시간을 리턴

SELECT SYSDATE AS NOW
SYSDATE -1 AS YESTERDAY
SYSDATE +1 AS TOMORROW
FROM DUAL;

숫자와 연산을 시켜서 어제, 내일이라는 날짜도 얻을 수 있다
숫자는 DAY값을 변경시킨다

숫자적 의미로 뺄셈을 하면 날짜는 더 작아지고
그말은 즉 과거의 날짜가 된다는 의미고

덧셈을하면 날짜는 더 커지고 미래의 날짜가 된다는 의미다

2. ADD_MONTHS 함수

특정 날짜에서 지정한 개월 수를 연산후 날짜 데이터를 RETURN

SELECT SYSDATE
ADD_MONTHS(SYSDATE, 3)
FROM DUAL;

SELECT 고용날짜
ADD_MONTHS(고용날짜, 12)
FROM DUAL;

현재 날짜에서 3개월을 더하거나
고용날부터 1년이 되는 날짜를 구할 수 있다

3과 12는 +3과 +12라고 할수있다
-3과 -12 를 입력하면 당연하게도 지정한 만큼
이전의 개월수를 연산해서 RETURN한다

/*입사 10년 미만인 사원정보 출력?*/

SELECT 사원정보
FROM EMP
WHERE ADD_MONTHS(입사날짜, 120) > SYSDATE;

WHERE절에서 사용하면 원하는 형태의 데이터만 얻을 수도 있다

3. MONTHS_BETWEEN 함수

날짜간의 개월 수 차이를 리턴하는 함수

MONTHS_BETWEEN(날짜1, 날짜2)

/*사원이 입사한지 몇개월인지 검색해라*/

SELECT 사원이름,
MONTHS_BETWEEN(SYSDATE, 입사날짜) 
AS 입사개월수
FROM EMP

날짜1 - 날짜2 의 형태로 값이 나오기때문에
RETURN받을 데이터의 값을 양수로 받고 싶다면

날짜1을 날짜2보다 더 큰값 즉 더 미래의 날짜를 쓴다면
두 날짜의 개월수 차이만큼 양수의 형태로 RETURN 받을 수 있다

추가로 날짜 데이터엔 개월만 있는게 아닌 날짜와 시간도 있기때문에
두날짜가 정확하게 한달차이가 아니라면 데이터를 1개월을 1로두면
나머지의 차이값을 소수점으로 RETURN한다

1달 15일이 차이난다면 1.5 이런식으로 RETURN 

개월수 차이만 얻고 싶다면 소숫점을 날리는 함수를 쓰면 된다

SELECT ENAME,
FLOOR(MONTHS_BETWEEN(SYSDATE, HIREDATE))
AS 입사개월수
FROM EMP;

FLOOR 을 사용해 소숫점을 다버리면 두 날짜의 개월수 차이를 리턴받는다

INT로 CAST(명시적 형변환)하면
소숫점을 반올림한다 (ROUND도 반올림한다)

SELECT HIREDATE, CAST(MONTHS_BETWEEN(HIREDATE, '20/01/01') AS INT)
FROM TEMP;

SELECT HIREDATE, ROUND(MONTHS_BETWEEN(HIREDATE, '20/01/01'))
FROM TEMP;

SELECT HIREDATE, FLOOR(MONTHS_BETWEEN(HIREDATE, '20/01/01'))
FROM TEMP;

SELECT HIREDATE, CEIL(MONTHS_BETWEEN(HIREDATE, '20/01/01'))
FROM TEMP;

FLOOR은 버림 CEIL은 올림하고 있다
보통은 FLOOR을 이용해서 버림형태로 쓰여진다

반올림의 경우 MONTHS_BETWEEN의 RETURN값이 0.5이상일 경우
1로 리턴하므로 정확하게 구분지어서 사용해야 한다

4. NEXT_DAY / LAST_DAY

NEXT_DAY(날짜, 지정요일)

지정요일을 쓰는법은 일요일부터 1, 2, 3 ... 토요일 = 7로 사용
nls_date_language 를 Korean 으로 설정하면 숫자가 아닌 '월', '화' 같이 사용 가능하다 (한국어로 설치되어있으면 기본적으로 사용가능)
만일 American 으로 설정한다면 'Mon', 'Tue' 같이 사용 가능

  • 언어 상관없이 숫자로 사용하면 범용성이 좋기때문에
    숫자로 사용하는걸 추천한다

날짜를 기준으로 가장 빠른 지정요일의 날짜를 RETURN
단 기준날짜의 요일과 지정요일이 같다면 기준날짜가 아닌
일주일 뒤의 날짜를 RETURN한다

SELECT
NEXT_DAY(SYSDATE, '금')		/*현재 날짜에서 가장 빠른 금요일의 날짜를 RETURN*/
FROM DUAL;

LAST_DAY(날짜)

해당 월의 가장 마지막 날을 RETURN 한다
날짜를 계산하다보면 매월 말일이 30이거나 31이거나 다를경우가 생긴다
이럴 경우에 쓰면 좋은 함수다

SELECT LAST_DAY(SYSDATE)
FROM DUAL;

NEXT_DAY와는 다르게
입력 날짜가 해당월의 말일이면 같은 날짜를 리턴한다
월을 기준으로 한다는 것을 기억해 둘것

DB의 기능으로 특정 데이터를 뽑는것과
JAVA에서 특정 데이터를 뽑는 기능을 만들어서
뽑는것은 효율면에서 엄청난 차이가 난다
DB설계를 잘해야하는 이유라고 생각한다

profile
BackEnd_BasketBall_Beom

0개의 댓글