본문 바로가기

Oracle

Oracle SQL 함수 정리


1. 숫자 함수 (Number Functions)

숫자를 다룰 때 자주 사용하는 기본 함수와 예제입니다.

  • 절대값: ABS(x)
  • 올림: CEIL(x)
  • 내림: FLOOR(x)
  • 반올림: ROUND(x, n) (소수점 n자리)
  • 절사: TRUNC(x, n) (소수점 n자리 이하 자름)
  • 나머지: MOD(x, y)
-- 절대값
SELECT ABS(-1.234) AS absolute
FROM dual;

-- 올림 (ceil)
SELECT CEIL(-10.1234) AS ceil
FROM dual;

-- 내림 (floor)
SELECT FLOOR(10.1234) AS floor
FROM dual;

-- 반올림 (소수점 1자리, 소수점 첫째 자리에서 올림)
SELECT ROUND(192.153, 1) AS round_1
FROM dual;

-- 반올림 (소수점 -1자리: 10의 자리)
SELECT ROUND(192.153, -1) AS round_m1
FROM dual;

-- 절사 (소수점 2자리 이하 절사)
SELECT TRUNC(7.5597, 2) AS trunc
FROM dual;

-- 나머지
SELECT MOD(9, 4) AS mod
FROM dual;

1.1 주요 Oracle Number Functions

함수명 설명

ABS 절대값
CEIL x 이상 최소 정수 (올림)
FLOOR x 이하 최대 정수 (내림)
ROUND 반올림
TRUNC 절사
MOD 나머지
POWER 거듭제곱
SQRT 제곱근
LOG, LN 로그
EXP ex
SIGN 부호
BITAND 비트 연산
REMAINDER IEEE 모드 나머지
WIDTH_BUCKET 히스토그램 버킷 할당
기타 삼각함수, 쌍곡함수 등 다양

2. 문자열 함수 (String Functions)

Oracle 문자열 함수는 1-based 인덱스를 사용합니다.
음수 인덱스는 뒤에서부터 문자 위치를 지정합니다.

2.1 SUBSTR / SUBSTRB

  • SUBSTR(str, start) : 시작 위치부터 끝까지
  • SUBSTR(str, start, length) : 시작 위치부터 지정 길이만큼
  • 음수 시작 위치: 끝에서부터 카운트
-- 3번째 문자부터 끝까지
SELECT SUBSTR('oracleclub', 3) AS name
FROM dual;

-- 3번째 문자부터 4글자
SELECT SUBSTR('oracleclub', 3, 4) AS name
FROM dual;

-- 뒤에서 3번째 문자부터 2글자 (음수 인덱스)
SELECT SUBSTR('oracleclub', -3, 2) AS name
FROM dual;

바이트 단위 슬라이싱 (SUBSTRB, LENGTHB)

Oracle에서 한글은 1자당 3바이트로 처리됩니다.

-- 바이트 단위로 자르기
SELECT SUBSTRB('오라클클럽', 1) AS part1  -- '오'
FROM dual;

SELECT SUBSTRB('오라클클럽', 5) AS part2  -- '클클럽'
FROM dual;

-- 전체 바이트 길이
SELECT LENGTHB('오라클클럽') AS byte_len
FROM dual;

2.2 REPLACE

문자열 내 패턴을 변경합니다. 대소문자를 구분하니 주의하세요.

-- oracle → db로 치환
SELECT REPLACE('oracleclub', 'oracle', 'db') AS replaced
FROM dual;  -- 결과: 'dbclub'

3. 날짜형 함수 및 산술 연산 (Date Functions & Arithmetic)

3.1 TO_CHAR를 이용한 포맷팅

SELECT
  TO_CHAR(SYSDATE,       'rrrr-mm-dd hh24:mi:ss') AS "지금시간",
  TO_CHAR(SYSDATE - 1,   'rrrr-mm-dd hh24:mi:ss') AS "하루전시간",
  TO_CHAR(SYSDATE - 1/24,'rrrr-mm-dd hh24:mi:ss') AS "1시간전시간",
  TO_CHAR(SYSDATE - 1/24/60,'rrrr-mm-dd hh24:mi:ss') AS "1분전시간",
  TO_CHAR(SYSDATE
     - (5/24 + 30/24/60 + 10/24/60/60),
     'rrrr-mm-dd hh24:mi:ss')                      AS "5시간30분10초전"
FROM dual;

3.2 날짜 산술 연산

연산 결과 타입 사용 목적

날짜 + 숫자 날짜 특정 일자부터 N일 후
날짜 - 숫자 날짜 특정 일자부터 N일 전
날짜 - 날짜 숫자 두 날짜 사이 일수 차이
-- 입대일자부터 18개월 후 전역일자 계산
SELECT
  SYSDATE                        AS 입대일자,
  ADD_MONTHS(SYSDATE, 18)        AS 전역일자
FROM dual;

-- 태어난 날부터 오늘까지 총 일수, 마지막 날짜
SELECT
  SYSDATE - TO_DATE('1990-04-05','yyyy-mm-dd') AS 살아온일수,
  LAST_DAY(SYSDATE)                             AS 이번달_말일
FROM dual;

-- 살아온 개월수
SELECT
  MONTHS_BETWEEN(SYSDATE, TO_DATE('1990-04-05','yyyy-mm-dd'))
    AS 살아온개월수
FROM dual;

4. 실습 문제: 근속 개월수, 연수, 잔여월수 조회

문제 설명

사원 테이블(sawon)에서 현재일자 기준으로 아래 항목을 조회하세요.

  • 근속총월수
  • 근속년수 (총월수 ÷ 12, 소수 이하 절사)
  • 잔여월수 (총월수 mod 12)

해답 예시

SELECT
  sabun,
  saname,
  sajob,
  sahire,
  TRUNC(
    MONTHS_BETWEEN(SYSDATE, sahire)
  )                                       AS 근속총월수,
  FLOOR(
    TRUNC(MONTHS_BETWEEN(SYSDATE, sahire)) / 12
  )                                       AS 근속년수,
  MOD(
    TRUNC(MONTHS_BETWEEN(SYSDATE, sahire)), 12
  )                                       AS 잔여월수
FROM sawon;
  • MONTHS_BETWEEN(date1, date2) : 두 날짜 사이 개월수 계산
  • TRUNC() : 소수점 이하 절사
  • FLOOR() : 내림 처리
  • MOD(x, y) : 나머지 계산