데이터베이스마다 날짜 차이를 계산하는 방식은 다르다.
특히 Oracle은 연산 중심, MySQL과 MariaDB는 함수 중심이라는 차이가 있다.
Oracle은 DATE 타입이 내부적으로 '일 단위 숫자'로 표현되기 때문에 날짜 간 뺄셈 연산이 가능하다.
이 결과는 일(day) 단위이며, 시간까지 포함되면 소수로 반환된다.
end_date - start_date;
MySQL과 MariaDB에서는 DATEDIFF를 사용하는 것이 표준적인 방법이다.
DATE 타입으로 변환 후 빼기 연산도 가능하지만, 이는 내부적으로 날짜가 숫자로 변환되어 계산되는 방식이므로 DBMS에 따라 동작이 달라질 수 있어 권장되지 않는다고 한다.
DATEDIFF(end_date, start_date);
date(end_date) - date(start_date)
DATEDIFF 함수를 사용했을 때의 특징은 다음과 같다.
Oracle은 날짜 차이를 구한 뒤 직접 단위 변환을 해야 한다.
SELECT (end_date - start_date) * 24 AS hours FROM dual;
MySQL과 MariaDB는 TIMESTAMPDIFF 함수를 사용하여 단위를 직접 지정할 수 있다.
SELECT TIMESTAMPDIFF(HOUR, start_date, end_date);
SELECT TIMESTAMPDIFF(MINUTE, start_date, end_date);
SELECT TIMESTAMPDIFF(SECOND, start_date, end_date);
Oracle은 MONTHS_BETWEEN 함수를 제공한다.
SELECT MONTHS_BETWEEN(end_date, start_date) FROM dual;
예를 들어 1.5개월 같은 값이 나올 수 있다.
SELECT TIMESTAMPDIFF(MONTH, start_date, end_date);
SELECT
FLOOR(MONTHS_BETWEEN(end_date, start_date)/12) AS years,
MOD(FLOOR(MONTHS_BETWEEN(end_date, start_date)), 12) AS months
FROM dual;
SELECT
TIMESTAMPDIFF(YEAR, start_date, end_date) AS years,
TIMESTAMPDIFF(MONTH, start_date, end_date) % 12 AS months,
DATEDIFF(end_date, start_date) % 30 AS days;
Oracle
WHERE SYSDATE - created_at >= 7
MySQL / MariaDB
WHERE DATEDIFF(NOW(), created_at) >= 7
Oracle
WHERE created_at >= SYSDATE - 7
MySQL / MariaDB
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
Oracle
WHERE created_at BETWEEN
TO_DATE('2026-03-01','YYYY-MM-DD')
AND TO_DATE('2026-03-31','YYYY-MM-DD')
MySQL / MariaDB
WHERE created_at BETWEEN '2026-03-01' AND '2026-03-31'
Oracle
WHERE TRUNC(created_at) = TRUNC(SYSDATE)
MySQL / MariaDB
WHERE DATE(created_at) = CURDATE()
| 구분 | Oracle | MySQL | MariaDB |
|---|---|---|---|
| 날짜 차이 | 날짜끼리 빼기 | DATEDIFF | DATEDIFF |
| 시간 계산 | 직접 연산 | TIMESTAMPDIFF | TIMESTAMPDIFF |
| 개월 계산 | MONTHS_BETWEEN (소수 가능) | 정수 반환 | 정수 반환 |
| 반환 타입 | 실수 가능 | 정수 | 정수 |
| 문법 유사성 | 자체 문법 | 자체 문법 | MySQL과 거의 동일 |
Oracle은 날짜를 숫자처럼 다루기 때문에 연산 중심으로 처리한다.
MySQL과 MariaDB는 날짜 연산을 위해 전용 함수를 사용한다.
MariaDB가 MySQL의 기능을 더 확장하고 개선해서 만든 것이기 때문에 문법이 거의 동일하다.
Oracle, MySQL, MariaDB 모두 인자의 순서가 중요하다.
Oracle에서는 단순히 빼기 연산이기 때문에 순서에 따라 음수가 나올 수 있다.
end - start
MySQL과 MariaDB에서는 DATEDIFF의 인자 순서가 중요하다.
DATEDIFF(end, start)