MySQL 날짜 비교 및 조작: 예제와 성능 팁을 포함한 완전 가이드

1. Introduction

MySQL에서 날짜를 다루는 것은 데이터베이스 작업에서 가장 중요한 측면 중 하나입니다. 예를 들어, 날짜별로 매출 데이터를 집계하거나 특정 기간 내의 레코드를 검색할 때 날짜 비교가 필수적입니다.

이 문서는 MySQL에서 날짜 조작 및 비교의 기본부터 고급 사용 사례와 성능 최적화 기법까지 모두 설명합니다. 초보자부터 중급 개발자까지 모든 수준의 사용자가 유용하게 활용할 수 있도록 설계되었습니다.

2. Overview of MySQL Date Data Types

Types of Date Data Types and Their Characteristics

MySQL은 다음과 같은 세 가지 주요 날짜 데이터 타입을 제공합니다. 아래는 각 타입에 대한 간략한 설명입니다.

  1. DATE
  • 저장 형식: 연-월-일 (YYYY-MM-DD)
  • 특징: 시간 정보가 포함되지 않아 단순 날짜 관리에 적합합니다.
  • 사용 사례: 생일, 마감일
  1. DATETIME
  • 저장 형식: 연-월-일 및 시간 (YYYY-MM-DD HH:MM:SS)
  • 특징: 시간 정보가 포함되어 정확한 타임스탬프 기록에 적합합니다.
  • 사용 사례: 생성 타임스탬프, 최종 업데이트 타임스탬프
  1. 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에서는 날짜 비교에 다음 연산자를 사용합니다.

  1. = (Equal)
  • 지정된 날짜와 일치하는 레코드를 조회합니다.
    SELECT * FROM events WHERE event_date = '2025-01-01';
    
  1. > / < (Greater Than / Less Than)
  • 지정된 날짜 이전 또는 이후의 레코드를 검색합니다.
    SELECT * FROM events WHERE event_date > '2025-01-01';
    
  1. <= / >= (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_monthtotal_events
110
215

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에서 날짜 조작 및 비교 기술에 대한 포괄적인 설명을 제공했습니다. 주요 요점은 다음과 같습니다:

  1. 날짜 데이터 유형(DATE, DATETIME, TIMESTAMP)의 특성과 올바른 사용법 이해.
  2. 기본 비교 방법(=, >, <, BETWEEN 등).
  3. 날짜 차이 계산(DATEDIFF(), TIMESTAMPDIFF()).
  4. 인덱싱 및 최적의 쿼리 설계를 통한 성능 향상.

이 가이드가 MySQL에서 날짜 작업을 효율적으로 처리하고 실제 애플리케이션에 적용 가능한 실용적이고 최적화된 쿼리를 개발하는 데 도움이 되길 바랍니다.