문자열을 날짜로 변환하는 함수예요.
-- 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 | %Y | 4자리 연도 |
YY | %y | 2자리 연도 |
MM | %m | 월 (01~12) |
DD | %d | 일 (01~31) |
HH24 | %H | 24시간 형식 시 |
HH | %h | 12시간 형식 시 |
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')
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에서 에러 납니다.
날짜나 숫자를 문자열로 변환하는 함수예요.
날짜 → 문자열
-- 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 (단순 변환)
| 목적 | Oracle | MySQL |
|---|---|---|
| 문자 → 날짜 | 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)