1. Introduction
MySQL에서 날짜를 다루는 것은 데이터베이스 작업에서 가장 중요한 측면 중 하나입니다. 예를 들어, 날짜별로 매출 데이터를 집계하거나 특정 기간 내의 레코드를 검색할 때 날짜 비교가 필수적입니다.
이 문서는 MySQL에서 날짜 조작 및 비교의 기본부터 고급 사용 사례와 성능 최적화 기법까지 모두 설명합니다. 초보자부터 중급 개발자까지 모든 수준의 사용자가 유용하게 활용할 수 있도록 설계되었습니다.
2. Overview of MySQL Date Data Types
Types of Date Data Types and Their Characteristics
MySQL은 다음과 같은 세 가지 주요 날짜 데이터 타입을 제공합니다. 아래는 각 타입에 대한 간략한 설명입니다.
- DATE
- 저장 형식: 연-월-일 (
YYYY-MM-DD) - 특징: 시간 정보가 포함되지 않아 단순 날짜 관리에 적합합니다.
- 사용 사례: 생일, 마감일
- DATETIME
- 저장 형식: 연-월-일 및 시간 (
YYYY-MM-DD HH:MM:SS) - 특징: 시간 정보가 포함되어 정확한 타임스탬프 기록에 적합합니다.
- 사용 사례: 생성 타임스탬프, 최종 업데이트 타임스탬프
- TIMESTAMP
- 저장 형식: 연-월-일 및 시간 (
YYYY-MM-DD HH:MM:SS) - 특징: 시간대에 따라 달라지며, 다양한 지역의 날짜와 시간을 관리하는 데 유용합니다.
- 사용 사례: 로그 데이터, 거래 기록
How to Choose the Appropriate Data Type
- 시간이 필요하지 않다면 DATE 를 선택하세요.
- 시간이 필요하다면 애플리케이션의 시간대 요구사항에 따라 DATETIME 또는 TIMESTAMP 를 선택하세요.
Sample Query
아래는 각 데이터 타입을 사용한 예시입니다.
CREATE TABLE events (
event_id INT AUTO_INCREMENT PRIMARY KEY,
event_date DATE,
event_datetime DATETIME,
event_timestamp TIMESTAMP
);
3. How to Compare Dates
Using Basic Comparison Operators
MySQL에서는 날짜 비교에 다음 연산자를 사용합니다.
=(Equal)
- 지정된 날짜와 일치하는 레코드를 조회합니다.
SELECT * FROM events WHERE event_date = '2025-01-01';
>/<(Greater Than / Less Than)
- 지정된 날짜 이전 또는 이후의 레코드를 검색합니다.
SELECT * FROM events WHERE event_date > '2025-01-01';
<=/>=(Less Than or Equal / Greater Than or Equal)
- 지정된 날짜를 포함하는 범위 내의 레코드를 검색합니다.
SELECT * FROM events WHERE event_date <= '2025-01-10';
Range Queries Using BETWEEN
BETWEEN 연산자를 사용하면 날짜 범위를 쉽게 지정할 수 있습니다.
SELECT * FROM events
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-31';
Important Note:
BETWEEN은 시작값과 종료값을 모두 포함하므로, 필요한 데이터가 범위에서 의도치 않게 제외되지 않도록 주의하세요.
4. Calculating Date Differences
Using the DATEDIFF Function
DATEDIFF() 함수는 두 날짜 사이의 차이(일)를 계산합니다.
SELECT DATEDIFF('2025-01-10', '2025-01-01') AS days_difference;
Result:
- 9 days
Using the TIMESTAMPDIFF Function
TIMESTAMPDIFF() 함수는 연, 월, 일, 시간 등 특정 단위로 차이를 계산할 수 있게 해줍니다.
SELECT TIMESTAMPDIFF(MONTH, '2025-01-01', '2025-12-31') AS months_difference;
Result:
- 11 months
5. Date Addition and Subtraction
Date Manipulation Using the INTERVAL Clause
MySQL에서는 INTERVAL 절을 사용해 날짜에 시간을 쉽게 더하거나 뺄 수 있습니다. 이를 통해 특정 기간 이전 또는 이후의 날짜를 조회하는 쿼리를 만들 수 있습니다.
Adding to a Date
INTERVAL을 사용해 날짜에 시간을 더하는 예시:
SELECT DATE_ADD('2025-01-01', INTERVAL 7 DAY) AS plus_seven_days;
Result:
2025-01-08
Subtracting from a Date
INTERVAL을 사용해 날짜에서 시간을 빼는 방법도 동일합니다:
SELECT DATE_SUB('2025-01-01', INTERVAL 1 MONTH) AS minus_one_month;
결과:
2024-12-01
사용 사례: 알림 시스템
Below is an example query that retrieves events occurring exactly seven days ago, which can be used for sending automated reminder notifications.
SELECT event_name, event_date
FROM events
WHERE event_date = DATE_SUB(CURDATE(), INTERVAL 7 DAY);
현재 날짜를 기준으로 한 계산
CURDATE(): 현재 날짜를 반환합니다 (YYYY-MM-DD).NOW(): 현재 날짜와 시간을 반환합니다 (YYYY-MM-DD HH:MM:SS).
예시: 오늘로부터 일주일 후의 날짜를 계산합니다.
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY) AS next_week;
6. 실용적인 쿼리 예시
특정 날짜에 대한 레코드 조회
지정된 날짜와 일치하는 이벤트를 조회합니다.
SELECT *
FROM events
WHERE event_date = '2025-01-01';
날짜 범위 내 데이터 조회
일주일 범위 내 이벤트를 검색하는 예시입니다.
SELECT *
FROM events
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-07';
날짜별 데이터 집계
이 쿼리는 각 월에 등록된 이벤트 수를 계산합니다.
SELECT MONTH(event_date) AS event_month, COUNT(*) AS total_events
FROM events
GROUP BY MONTH(event_date);
예시 결과:
| event_month | total_events |
|---|---|
| 1 | 10 |
| 2 | 15 |
7. 성능 최적화
인덱스를 활용한 효율적인 검색
날짜 컬럼에 인덱스를 설정하면 쿼리 성능을 크게 향상시킬 수 있습니다.
인덱스 생성
다음 SQL은 event_date 컬럼에 인덱스를 생성합니다.
CREATE INDEX idx_event_date ON events(event_date);
인덱스 효과 확인
EXPLAIN을 사용하여 쿼리 실행 계획을 확인할 수 있습니다.
EXPLAIN SELECT *
FROM events
WHERE event_date = '2025-01-01';
함수를 사용할 때 중요한 주의사항
WHERE 절에 함수를 사용하면 인덱스 사용이 비활성화될 수 있습니다.
잘못된 예시
다음 쿼리에서는 DATE() 함수가 인덱스 사용을 방해합니다.
SELECT *
FROM events
WHERE DATE(event_date) = '2025-01-01';
개선된 예시
함수를 사용하지 않고 값을 직접 비교하는 것이 권장됩니다.
SELECT *
FROM events
WHERE event_date >= '2025-01-01'
AND event_date < '2025-01-02';

8. FAQ (자주 묻는 질문)
Q1: DATE와 DATETIME의 차이점은 무엇인가요?
- A1:
- DATE: 날짜만 저장합니다 (
YYYY-MM-DD). 시간 정보가 필요하지 않을 때 사용합니다. - DATETIME: 날짜와 시간을 모두 저장합니다 (
YYYY-MM-DD HH:MM:SS). 이벤트의 정확한 타임스탬프가 필요할 때 사용합니다.
예시:
CREATE TABLE examples (
example_date DATE,
example_datetime DATETIME
);
Q2: BETWEEN을 사용하여 날짜 범위를 지정할 때 주의할 점은 무엇인가요?
- A2:
BETWEEN은 시작일과 종료일을 모두 포함하므로, 종료일에 시간 값이 없으면 의도한 모든 레코드를 가져오지 못할 수 있습니다.
예시:
-- This query may not retrieve records such as "2025-01-31 23:59:59"
SELECT *
FROM events
WHERE event_date BETWEEN '2025-01-01' AND '2025-01-31';
개선:
명시적으로 종료 시간을 23:59:59 로 설정하거나 시간 부분을 무시하는 비교를 사용합니다.
SELECT *
FROM events
WHERE event_date >= '2025-01-01' AND event_date < '2025-02-01';
Q3: 시간대 차이는 어떻게 처리해야 하나요?
- A3: MySQL에서
TIMESTAMP타입은 시간대에 따라 달라집니다. 반면DATETIME타입은 고정값을 저장하며 시간대의 영향을 받지 않습니다.
현재 시간대 설정 확인:
SHOW VARIABLES LIKE 'time_zone';
시간대 설정 변경:
SET time_zone = '+09:00'; -- Japan Standard Time (JST)
Q4: 지난 30일의 데이터를 어떻게 조회할 수 있나요?
- A4:
CURDATE()또는NOW()와INTERVAL을 결합하여 지난 30일의 데이터를 조회할 수 있습니다.
예시:
SELECT *
FROM events
WHERE event_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
Q5: 날짜 비교 성능을 어떻게 향상시킬 수 있나요?
- A5:
- 인덱스 생성: 날짜 열에 인덱스를 설정합니다.
- 함수 사용 피하기:
WHERE절에서 함수를 사용하면 인덱스가 비활성화될 수 있으므로 직접 비교를 사용하세요.
9. 요약
이 문서의 핵심 포인트
이 문서는 MySQL에서 날짜 조작 및 비교 기술에 대한 포괄적인 설명을 제공했습니다. 주요 요점은 다음과 같습니다:
- 날짜 데이터 유형(DATE, DATETIME, TIMESTAMP)의 특성과 올바른 사용법 이해.
- 기본 비교 방법(
=,>,<,BETWEEN등). - 날짜 차이 계산(
DATEDIFF(),TIMESTAMPDIFF()). - 인덱싱 및 최적의 쿼리 설계를 통한 성능 향상.
이 가이드가 MySQL에서 날짜 작업을 효율적으로 처리하고 실제 애플리케이션에 적용 가능한 실용적이고 최적화된 쿼리를 개발하는 데 도움이 되길 바랍니다.


