MySQL, MariaDB, Oracle 날짜 차이 계산 비교

다람·3일 전

SQL

목록 보기
1/1

데이터베이스마다 날짜 차이를 계산하는 방식은 다르다.
특히 Oracle은 연산 중심, MySQL과 MariaDB는 함수 중심이라는 차이가 있다.

1. 일(day) 단위 차이 계산

Oracle

Oracle은 DATE 타입이 내부적으로 '일 단위 숫자'로 표현되기 때문에 날짜 간 뺄셈 연산이 가능하다.
이 결과는 일(day) 단위이며, 시간까지 포함되면 소수로 반환된다.

end_date - start_date;
  • 결과는 일(day) 단위 숫자
  • 시간까지 포함되면 소수로 반환된다

MySQL / MariaDB

MySQL과 MariaDB에서는 DATEDIFF를 사용하는 것이 표준적인 방법이다.
DATE 타입으로 변환 후 빼기 연산도 가능하지만, 이는 내부적으로 날짜가 숫자로 변환되어 계산되는 방식이므로 DBMS에 따라 동작이 달라질 수 있어 권장되지 않는다고 한다.

DATEDIFF(end_date, start_date);

date(end_date) - date(start_date)

DATEDIFF 함수를 사용했을 때의 특징은 다음과 같다.

  • 결과는 일(day) 단위 정수
  • 시간 정보는 무시된다
  • 두 DB는 동일한 문법을 사용한다

2. 시간 단위 차이 계산 (시, 분, 초)

Oracle

Oracle은 날짜 차이를 구한 뒤 직접 단위 변환을 해야 한다.

SELECT (end_date - start_date) * 24 AS hours FROM dual;
  • 시(hour): 24 곱하기
  • 분(minute): 24 * 60
  • 초(second): 24 60 60

MySQL / MariaDB

MySQL과 MariaDB는 TIMESTAMPDIFF 함수를 사용하여 단위를 직접 지정할 수 있다.

SELECT TIMESTAMPDIFF(HOUR, start_date, end_date);
SELECT TIMESTAMPDIFF(MINUTE, start_date, end_date);
SELECT TIMESTAMPDIFF(SECOND, start_date, end_date);
  • 원하는 단위를 직접 지정 가능

3. 개월(month) 차이 계산

Oracle

Oracle은 MONTHS_BETWEEN 함수를 제공한다.

SELECT MONTHS_BETWEEN(end_date, start_date) FROM dual;
  • 결과는 소수까지 포함된 값
  • 정밀한 개월 계산 가능

예를 들어 1.5개월 같은 값이 나올 수 있다.

MySQL / MariaDB

SELECT TIMESTAMPDIFF(MONTH, start_date, end_date);
  • 결과는 정수만 반환
  • 소수 단위 개월 계산은 불가능

4. 년/월/일 근무 기간 계산

Oracle

SELECT 
  FLOOR(MONTHS_BETWEEN(end_date, start_date)/12) AS years,
  MOD(FLOOR(MONTHS_BETWEEN(end_date, start_date)), 12) AS months
FROM dual;
  • 개월을 기준으로 년과 월을 나누어 계산

MySQL / MariaDB

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;
  • 각 단위를 별도로 계산
  • 일(day)은 달마다 30일이 아니기 때문에 별도 로직 또는 날짜 함수 조합을 사용하는 것이 안전하다.

5. 자주 사용하는 날짜 조건

특정 기간 이전 데이터 (N일 이상 지난 데이터)

Oracle

WHERE SYSDATE - created_at >= 7

MySQL / MariaDB

WHERE DATEDIFF(NOW(), created_at) >= 7

최근 N일 데이터

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()

6. 핵심 차이

구분OracleMySQLMariaDB
날짜 차이날짜끼리 빼기DATEDIFFDATEDIFF
시간 계산직접 연산TIMESTAMPDIFFTIMESTAMPDIFF
개월 계산MONTHS_BETWEEN (소수 가능)정수 반환정수 반환
반환 타입실수 가능정수정수
문법 유사성자체 문법자체 문법MySQL과 거의 동일

7. 정리

Oracle은 날짜를 숫자처럼 다루기 때문에 연산 중심으로 처리한다.
MySQL과 MariaDB는 날짜 연산을 위해 전용 함수를 사용한다.
MariaDB가 MySQL의 기능을 더 확장하고 개선해서 만든 것이기 때문에 문법이 거의 동일하다.


8. 사용시 주의사항

Oracle, MySQL, MariaDB 모두 인자의 순서가 중요하다.

Oracle에서는 단순히 빼기 연산이기 때문에 순서에 따라 음수가 나올 수 있다.

end - start

MySQL과 MariaDB에서는 DATEDIFF의 인자 순서가 중요하다.

DATEDIFF(end, start)
profile
개발하는 다람쥐

0개의 댓글