MYSQL 함수정리

최준병·2026년 3월 31일

Oracle → MySQL 함수 매핑

1. TO_DATE → STR_TO_DATE

문자열을 날짜로 변환하는 함수예요.

-- Oracle
SELECT TO_DATE('2024-01-15', 'YYYY-MM-DD') FROM dual;

-- MySQL
SELECT STR_TO_DATE('2024-01-15', '%Y-%m-%d');

포맷 문자열이 다릅니다 — 이게 가장 헷갈리는 부분이에요.

Oracle 포맷MySQL 포맷의미
YYYY%Y4자리 연도
YY%y2자리 연도
MM%m월 (01~12)
DD%d일 (01~31)
HH24%H24시간 형식 시
HH%h12시간 형식 시
MI%i
SS%s
-- Oracle
TO_DATE('2024-01-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS')

-- MySQL
STR_TO_DATE('2024-01-15 14:30:00', '%Y-%m-%d %H:%i:%s')

2. TRUNC → DATE_FORMAT / DATE / FLOOR

Oracle의 TRUNC는 날짜/숫자 양쪽 다 쓰는 함수라 MySQL에선 목적에 따라 나뉘어요.

날짜 절삭 (시분초 제거)

-- Oracle: 시분초 날려서 날짜만
SELECT TRUNC(SYSDATE) FROM dual;
SELECT TRUNC(created_at) FROM orders;

-- MySQL: DATE()로 동일하게
SELECT DATE(NOW());
SELECT DATE(created_at) FROM orders;

특정 단위로 절삭

-- Oracle: 월의 첫날로
SELECT TRUNC(SYSDATE, 'MM') FROM dual;  -- 2024-01-01

-- MySQL: DATE_FORMAT으로 동일 효과
SELECT DATE_FORMAT(NOW(), '%Y-%m-01');  -- 2024-01-01

-- Oracle: 연도의 첫날로
SELECT TRUNC(SYSDATE, 'YYYY') FROM dual;  -- 2024-01-01

-- MySQL
SELECT DATE_FORMAT(NOW(), '%Y-01-01');

숫자 절삭 (소수점)

-- Oracle
SELECT TRUNC(3.14159, 2) FROM dual;  -- 3.14

-- MySQL: TRUNCATE (함수명 다름!)
SELECT TRUNCATE(3.14159, 2);  -- 3.14

Oracle은 TRUNC, MySQL은 숫자에 TRUNCATE를 써요. TRUNC라고 쓰면 MySQL에서 에러 납니다.


3. TO_CHAR → DATE_FORMAT / CAST

날짜나 숫자를 문자열로 변환하는 함수예요.

날짜 → 문자열

-- Oracle
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM dual;
SELECT TO_CHAR(created_at, 'YYYY년 MM월 DD일') FROM orders;

-- MySQL: DATE_FORMAT
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
SELECT DATE_FORMAT(created_at, '%Y년 %m월 %d일') FROM orders;

숫자 → 문자열

-- Oracle
SELECT TO_CHAR(12345.6, '999,999.9') FROM dual;  -- 12,345.6

-- MySQL: FORMAT 또는 CAST
SELECT FORMAT(12345.6, 1);   -- 12,345.6 (천단위 콤마 자동)
SELECT CAST(12345.6 AS CHAR);  -- 12345.6 (단순 변환)

한눈에 보는 요약표

목적OracleMySQL
문자 → 날짜TO_DATE(str, fmt)STR_TO_DATE(str, fmt)
날짜 시분초 제거TRUNC(date)DATE(date)
날짜 월/연 단위 절삭TRUNC(date, 'MM')DATE_FORMAT(date, '%Y-%m-01')
숫자 소수점 절삭TRUNC(num, n)TRUNCATE(num, n)
날짜 → 문자TO_CHAR(date, fmt)DATE_FORMAT(date, fmt)
숫자 → 문자TO_CHAR(num, fmt)FORMAT(num, n) / CAST

추가로 자주 마주치는 차이점

Oracle에서 습관적으로 쓰던 것들이 MySQL에서 달라서 막히는 경우가 많아요.

-- Oracle의 dual 테이블 → MySQL은 그냥 생략
SELECT SYSDATE FROM dual;   -- Oracle
SELECT NOW();               -- MySQL (FROM 없어도 됨)

-- Oracle SYSDATE → MySQL NOW() 또는 CURDATE()
SYSDATE          → NOW()       -- 날짜+시간
SYSDATE (날짜만) → CURDATE()   -- 날짜만

-- NULL 처리
NVL(col, 0)      → IFNULL(col, 0)
NVL2(col, a, b)IF(col IS NOT NULL, a, b)
profile
나의 기록

0개의 댓글