MySQL 날짜 연산: DATE_ADD, DATE_SUB 및 INTERVAL (실용 예제 포함)

目次

1. Introduction

MySQL은 웹 애플리케이션 및 데이터베이스 관리를 위해 널리 사용되는 RDBMS(관계형 데이터베이스 관리 시스템)입니다. 많은 기능 중에서도 날짜 연산은 개발자들이 매일 사용하는 가장 중요한 기능 중 하나입니다. 예를 들어, 반복 알림 설정, 특정 기간 내 데이터 추출, 일정 계산 등 날짜와 관련된 시나리오는 무수히 많습니다.

특히 날짜를 더하고 빼는 작업은 자주 사용됩니다. MySQL은 DATE_ADDDATE_SUB 같은 편리한 함수와 INTERVAL 절을 제공하여 기간을 지정할 수 있게 합니다. 이를 활용하면 코드를 간결하게 유지하면서 복잡한 날짜 계산을 효율적으로 수행할 수 있습니다.

이 글에서는 MySQL에서 날짜를 더하고 빼는 방법을 초보자도 이해하기 쉽게 설명합니다. 기본 사용법부터 고급 예제까지 모두 다루고, 실제 프로젝트에 바로 적용할 수 있는 실용적인 노하우를 제공할 것입니다. 또한 흔히 겪는 문제와 주의해야 할 중요한 포인트도 함께 설명하므로, 날짜 처리에 자신이 없더라도 편안하게 배울 수 있습니다.

읽기를 마치면 MySQL 날짜 연산에 필요한 지식과 실전 기술을 갖추게 되며, 이를 자신의 프로젝트에 적용할 수 있게 됩니다.

2. Basic Knowledge You Need for MySQL Date Operations

MySQL에서 날짜를 다룰 때는 먼저 날짜/시간 데이터 타입과 기본 개념을 이해하는 것이 중요합니다. 이 섹션에서는 MySQL 날짜 연산에 필요한 기본 지식을 설명합니다.

Types of Date/Time Data

MySQL은 날짜와 시간을 처리하기 위해 여러 데이터 타입을 제공합니다. 각 타입의 특성을 이해하고 상황에 맞게 선택하는 것이 중요합니다.

  1. DATE
  • 달력 날짜(년, 월, 일)를 저장합니다.
  • 형식: YYYY-MM-DD
  • 예시: 2025-01-01
  • 날짜만 필요할 때(예: 생일, 생성일) 사용합니다.
  1. DATETIME
  • 날짜와 시간을 함께 저장합니다.
  • 형식: YYYY-MM-DD HH:MM:SS
  • 예시: 2025-01-01 12:30:45
  • 날짜와 시간이 모두 필요할 때(예: 이벤트 타임스탬프) 사용합니다.
  1. TIMESTAMP
  • UTC(협정 세계시)를 기준으로 날짜/시간을 저장하며, 시간대 변환을 지원합니다.
  • 형식: YYYY-MM-DD HH:MM:SS
  • 예시: 2025-01-01 12:30:45
  • 시간대 인식 데이터가 필요하거나 시스템 로그에 사용합니다.
  1. TIME
  • 시간 값을 저장합니다.
  • 형식: HH:MM:SS
  • 예시: 12:30:45
  • 순수한 시간 값이 필요할 때(예: 영업 시간) 사용합니다.
  1. YEAR
  • 연도 값만 저장합니다.
  • 형식: YYYY
  • 예시: 2025
  • 연도 수준으로 데이터를 관리할 때 사용합니다.

Important Notes When Using Date/Time Types

  • Timezone settings MySQL은 기본적으로 서버의 시간대 설정을 사용합니다. 그러나 애플리케이션이 다른 시간대를 사용한다면 데이터 불일치가 발생할 수 있습니다. 필요할 경우 시간대를 명시적으로 설정하세요.
  • Handling invalid dates 기본적으로 MySQL은 잘못된 날짜(예: 2025-02-30)가 지정되면 오류를 발생시킵니다. 하지만 서버 설정에 따라 NULL이나 기본값으로 변환될 수 있으므로, 설정을 반드시 확인해야 합니다.

Common Use Cases for Date Operations

  1. Extracting data for a specific period
  • 예시: 지난 일주일간의 매출 데이터 조회.
  1. Schedule calculations
  • 예시: 사용자가 가입한 후 30일 뒤에 알림 전송.
  1. Managing expiration dates
  • 예시: 쿠폰 만료일 관리.

Summary of the Basics

MySQL은 날짜와 시간을 다루기 위한 강력한 도구를 제공합니다. 날짜/시간 데이터 타입을 이해하고 상황에 맞게 선택함으로써 데이터베이스 설계와 쿼리 효율성을 높일 수 있습니다. 다음 섹션에서는 날짜 연산을 위한 구체적인 방법으로 DATE_ADD 함수를 자세히 살펴보겠습니다.

3. DATE_ADD Function: Basics and Practical Usage

The MySQL DATE_ADD 함수는 날짜에 지정된 간격을 추가하는 편리한 도구입니다. 이 섹션에서는 기본 사용법부터 실용적인 예제까지 모두 설명합니다.

DATE_ADD이란?

DATE_ADDINTERVAL 절에 지정된 기간을 주어진 날짜에 추가하고 새로운 날짜를 반환합니다. 날짜 계산을 단순화하는 기본적인 도구입니다.

기본 구문:

DATE_ADD(date, INTERVAL value unit)
  • date : 작업할 날짜 또는 datetime.
  • value : 추가할 숫자.
  • unit : 간격 단위 (예: DAY, MONTH, YEAR, HOUR, MINUTE, SECOND).

사용 가능한 INTERVAL 단위

다음 INTERVAL 단위들을 DATE_ADD과 함께 사용할 수 있습니다.

UnitDescription
SECONDSeconds
MINUTEMinutes
HOURHours
DAYDays
WEEKWeeks
MONTHMonths
YEARYears

기본 예제

다음은 DATE_ADD의 구체적인 예제입니다.

  1. 1일 후 계산 :
    SELECT DATE_ADD('2025-01-01', INTERVAL 1 DAY);
    

결과: 2025-01-02

  1. 1개월 후 계산 :
    SELECT DATE_ADD('2025-01-01', INTERVAL 1 MONTH);
    

결과: 2025-02-01

  1. 1년 후 계산 :
    SELECT DATE_ADD('2025-01-01', INTERVAL 1 YEAR);
    

결과: 2026-01-01

  1. 3시간 후 계산 :
    SELECT DATE_ADD('2025-01-01 12:00:00', INTERVAL 3 HOUR);
    

결과: 2025-01-01 15:00:00

  1. 여러 단위 추가 (중첩 사용) :
    SELECT DATE_ADD(DATE_ADD('2025-01-01', INTERVAL 1 DAY), INTERVAL 3 HOUR);
    

결과: 2025-01-02 03:00:00

동적 날짜 계산

동적으로 계산된 날짜에도 DATE_ADD을 적용할 수 있습니다.

  1. 오늘부터 7일 후 계산 :
    SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY);
    

결과: 오늘로부터 7일 후의 날짜.

  1. 지금부터 30분 후 계산 :
    SELECT DATE_ADD(NOW(), INTERVAL 30 MINUTE);
    

결과: 지금으로부터 30분 후의 datetime.

실용적인 예제

  1. 만료 날짜 계산 : 구매일로부터 30일 보증 기간을 계산합니다.
    SELECT DATE_ADD(purchase_date, INTERVAL 30 DAY) AS expiry_date
    FROM orders;
    
  1. 예약 알림 전송 : 이벤트 날짜 3일 전을 계산하고 알림을 보냅니다.
    SELECT DATE_ADD(event_date, INTERVAL -3 DAY) AS reminder_date
    FROM events;
    
  1. 로그 보존 기준 계산 : 오늘로부터 90일 전을 계산하고 그보다 오래된 로그를 삭제합니다.
    DELETE FROM logs
    WHERE log_date < DATE_ADD(CURDATE(), INTERVAL -90 DAY);
    

참고 사항

  • 잘못된 날짜 처리 : DATE_ADD 결과가 유효하지 않은 날짜가 되면 MySQL이 NULL을 반환할 수 있습니다. 입력 데이터가 올바른 형식인지 확인하세요.
  • 시간대 영향 : 시간대를 사용하는 경우 CURRENT_TIMESTAMP 및 NOW()와 같은 함수에 영향을 받을 수 있습니다.

DATE_ADD은 MySQL 날짜 작업에서 가장 기본적이면서도 강력한 도구 중 하나입니다. 이를 마스터하면 많은 날짜 계산을 효율적으로 처리할 수 있습니다. 다음 섹션에서는 DATE_SUB 함수에 대해 자세히 다루겠습니다.

4. DATE_SUB 함수: 기본 및 실용 사용법

DATE_SUB은 MySQL에서 DATE_ADD의 반대 역할을 합니다. 지정된 간격을 날짜에서 빼는 데 사용됩니다. 이 섹션에서는 기본 개념과 실제 업무에 활용할 수 있는 실용적인 예제를 설명합니다.

DATE_SUB이란?

DATE_SUBINTERVAL 절에 지정된 기간을 주어진 날짜 또는 datetime에서 빼고 새로운 날짜를 반환합니다. 날짜 차감을 위한 편리한 도구입니다.

기본 구문:

DATE_SUB(date, INTERVAL value unit)
  • date : 작업할 날짜 또는 datetime.
  • value : 빼야 할 숫자.
  • unit : 간격 단위 (예: DAY, MONTH, YEAR, HOUR, MINUTE, SECOND).

기본 예제

다음은 DATE_SUB의 구체적인 예제입니다.

  1. 1일 전 계산 :
    SELECT DATE_SUB('2025-01-01', INTERVAL 1 DAY);
    

결과: 2024-12-31

  1. 1개월 전 계산 :
    SELECT DATE_SUB('2025-01-01', INTERVAL 1 MONTH);
    

결과: 2024-12-01

  1. 1년 전 계산 :
    SELECT DATE_SUB('2025-01-01', INTERVAL 1 YEAR);
    

결과: 2024-01-01

  1. 3시간 이전 계산 :
    SELECT DATE_SUB('2025-01-01 12:00:00', INTERVAL 3 HOUR);
    

결과: 2025-01-01 09:00:00

  1. 여러 단위 빼기 (중첩 사용) :
    SELECT DATE_SUB(DATE_SUB('2025-01-01', INTERVAL 1 DAY), INTERVAL 3 HOUR);
    

결과: 2024-12-31 21:00:00

동적 날짜 계산

동적 날짜를 기반으로 DATE_SUB를 사용할 수도 있습니다.

  1. 오늘보다 7일 전 계산 :
    SELECT DATE_SUB(CURDATE(), INTERVAL 7 DAY);
    

결과: 오늘보다 7일 전 날짜.

  1. 현재보다 30분 전 계산 :
    SELECT DATE_SUB(NOW(), INTERVAL 30 MINUTE);
    

결과: 현재보다 30분 전 날짜시간.

실용 예시

  1. 지난 30일의 데이터 조회 :
    SELECT * 
    FROM orders
    WHERE order_date > DATE_SUB(CURDATE(), INTERVAL 30 DAY);
    
  1. 90일보다 오래된 데이터 삭제 :
    DELETE FROM logs
    WHERE log_date < DATE_SUB(CURDATE(), INTERVAL 90 DAY);
    
  1. 알림 : 이벤트 시작 1일 전에 알림을 설정합니다.
    SELECT event_name, DATE_SUB(event_date, INTERVAL 1 DAY) AS reminder_date
    FROM events;
    
  1. 근무 교대 계산 : 교대 시작 시간보다 3시간 전을 계산합니다.
    SELECT DATE_SUB(shift_start, INTERVAL 3 HOUR) AS preparation_time
    FROM work_shifts;
    

참고 사항

  • 잘못된 날짜 처리 : 빼기 결과가 유효하지 않은 날짜가 되면 MySQL이 NULL을 반환할 수 있습니다. 원본 날짜를 검증하는 것이 중요합니다.
  • 시간대 영향 : 서버의 시간대 설정이 다르면 DATE_SUB 결과가 예상치 못하게 변할 수 있습니다. 필요할 때 CONVERT_TZ()를 사용하세요.

DATE_SUB는 MySQL 날짜 작업에서 DATE_ADD만큼 중요합니다. 빼기 로직을 간결하게 유지하면 데이터 관리 및 분석 효율성을 향상시킬 수 있습니다. 다음 섹션에서는 5. INTERVAL 절 세부 사항 및 사용 방법을 설명합니다.

5. INTERVAL 절 세부 사항 및 사용 방법

INTERVAL 절은 MySQL 날짜/시간 연산에서 일반적으로 DATE_ADD 및 DATE_SUB와 함께 사용되어 기간을 더하거나 빼는 데 사용됩니다. 이 섹션에서는 기본부터 고급 사용까지 INTERVAL 절을 자세히 설명합니다.

INTERVAL 절 기본

INTERVAL 절은 대상 날짜에 얼마만큼의 시간을 더하거나 뺄지를 지정합니다. DATE_ADD 및 DATE_SUB와 함께 자주 사용되어 간결한 구문으로 강력한 날짜 연산을 가능하게 합니다.

기본 구문:

SELECT date + INTERVAL value unit;
SELECT date - INTERVAL value unit;
  • date : 작업 대상 날짜 또는 날짜시간.
  • value : 더하거나 뺄 숫자 값.
  • unit : 연산 단위 (예: DAY, MONTH, YEAR, HOUR, MINUTE, SECOND).

사용 가능한 단위

다음 단위들을 INTERVAL 절에서 사용할 수 있습니다.

UnitDescription
SECONDSeconds
MINUTEMinutes
HOURHours
DAYDays
WEEKWeeks
MONTHMonths
QUARTERQuarters
YEARYears
SECOND_MICROSECONDSeconds and microseconds
MINUTE_MICROSECONDMinutes and microseconds
MINUTE_SECONDMinutes and seconds
HOUR_MICROSECONDHours and microseconds
HOUR_SECONDHours and seconds
HOUR_MINUTEHours and minutes
DAY_MICROSECONDDays and microseconds
DAY_SECONDDays and seconds
DAY_MINUTEDays and minutes
DAY_HOURDays and hours
YEAR_MONTHYears and months

기본 예시

  1. 날짜에 1일 추가 :
    SELECT '2025-01-01' + INTERVAL 1 DAY;
    

결과: 2025-01-02

  1. 날짜시간에서 3시간 빼기 :
    SELECT '2025-01-01 12:00:00' - INTERVAL 3 HOUR;
    

결과: 2025-01-01 09:00:00

  1. 현재 날짜시간에서 10분 빼기 :
    SELECT NOW() - INTERVAL 10 MINUTE;
    
  1. 월말에서 다음 달 첫째 날 계산 :
    SELECT LAST_DAY('2025-01-01') + INTERVAL 1 DAY;
    

결과: 다음 달의 첫째 날.

고급 예시

  1. 날짜 범위 계산 지난 30일의 범위 계산.
    SELECT *
    FROM orders
    WHERE order_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE();
    
  1. 다음 분기의 시작 날짜 계산
    SELECT '2025-01-01' + INTERVAL 1 QUARTER;
    

결과: 다음 분기의 시작 날짜.

  1. 시간대 인식 시간 계산 서버 기본 시간대에서 한 시간 후의 날짜시간을 가져옵니다.
    SELECT CONVERT_TZ(NOW(), 'SYSTEM', '+09:00') + INTERVAL 1 HOUR;
    
  1. 보다 복잡한 계산 수행 오늘로부터 2주 후의 날짜를 계산한 다음 해당 월의 마지막 날을 구합니다.
    SELECT LAST_DAY(CURDATE() + INTERVAL 14 DAY);
    

참고사항

  1. 결과 유형에 유의하세요 INTERVAL 계산의 결과는 원래 유형(DATE 또는 DATETIME)을 유지합니다. 데이터 유형을 올바르게 처리하세요.
  2. 월말 동작 월말에 더하거나 빼면 MySQL이 다음 달의 말이나 시작으로 조정할 수 있습니다. 예를 들어, 2025-01-31에 1개월을 추가하면 2025-02-28(윤년이 아닌 해)이 됩니다.
  3. 시간대 영향 서버와 클라이언트에 서로 다른 시간대가 설정되어 있으면 datetime 계산이 예상치 못하게 이동할 수 있습니다.

INTERVAL 절은 MySQL 날짜 작업을 단순화하는 핵심 도구입니다. 유연성 덕분에 복잡한 날짜 계산을 쉽게 처리할 수 있습니다. 다음 섹션에서는 6. Practical Examples를 설명합니다.

6. 실용 예제

MySQL의 DATE_ADD 함수와 INTERVAL 절을 사용하면 복잡한 날짜 계산 및 동적 처리를 간단하게 할 수 있습니다. 이 섹션에서는 실제 업무에 유용한 여러 실용 예제를 소개합니다.

1. 특정 기간 내 데이터 추출

데이터 분석 및 보고에서는 특정 시간 범위 내의 레코드를 추출하는 것이 일반적입니다.

예시 1: 지난 30일간의 판매 데이터 조회

SELECT *
FROM sales
WHERE sale_date >= CURDATE() - INTERVAL 30 DAY;

설명: 오늘로부터 30일 전 날짜 이상인 데이터를 추출합니다.

예시 2: 이전 달 데이터 조회

SELECT *
FROM orders
WHERE order_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND CURDATE();

설명: 이전 달의 주문 데이터를 조회합니다.

2. 이벤트 알림 설정

이벤트 시작 날짜나 마감일을 기준으로 알림을 설정할 수 있습니다.

예시: 이벤트 시작 3일 전 알림 전송

SELECT event_name, DATE_SUB(event_date, INTERVAL 3 DAY) AS reminder_date
FROM events;

설명: 이벤트 날짜보다 3일 전 날짜를 계산하여 알림 날짜로 설정합니다.

3. 만료 날짜 관리

등록 날짜를 기준으로 만료 날짜를 계산하는 것은 많은 애플리케이션에서 사용됩니다.

예시 1: 등록 후 30일 뒤 만료 날짜 계산

SELECT user_id, registration_date, DATE_ADD(registration_date, INTERVAL 30 DAY) AS expiry_date
FROM users;

설명: 등록 날짜로부터 30일 후의 만료 날짜를 계산합니다.

예시 2: 만료된 데이터 삭제

DELETE FROM sessions
WHERE expiry_date < NOW();

설명: 현재 datetime을 기준으로 만료된 세션 데이터를 삭제합니다.

4. 근무 교대 및 일정 계산

근무 일정의 시작 또는 종료 시간을 기준으로 시간을 조정하는 예시입니다.

예시: 교대 시작 1시간 전 계산

SELECT shift_id, shift_start, DATE_SUB(shift_start, INTERVAL 1 HOUR) AS preparation_time
FROM shifts;

설명: 교대 시작 시간보다 1시간 전을 계산하여 준비 시간으로 표시합니다.

5. 여러 INTERVAL을 결합한 계산

계산에서 여러 기간을 결합하는 예시입니다.

예시 1: 오늘로부터 한 달 후의 월 마지막 날 구하기

SELECT LAST_DAY(CURDATE() + INTERVAL 1 MONTH);

설명: 오늘로부터 한 달 후의 월 마지막 날을 계산합니다.

예시 2: 등록 후 1년 뒤 3개월 유예 기간 추가

SELECT user_id, DATE_ADD(DATE_ADD(registration_date, INTERVAL 1 YEAR), INTERVAL 3 MONTH) AS final_deadline
FROM users;

설명: 등록 날짜에 1년을 더하고 추가로 3개월을 더해 최종 마감일을 계산합니다.

6. 데이터 정리 및 최적화

오래된 데이터를 삭제하여 데이터베이스를 최적화하는 예시입니다.

예시: 지난 90일 동안 로그인하지 않은 사용자 삭제

DELETE FROM user_activity
WHERE last_login < CURDATE() - INTERVAL 90 DAY;

설명: 오늘로부터 마지막 로그인 날짜가 90일 이상 지난 사용자를 삭제합니다.

참고

  • 계산 결과 검증 : 월말 및 윤년과 같은 경계 사례에 특별히 주의하십시오.
  • 데이터 유형 일관성 보장 : 올바른 날짜/시간 유형(DATE, DATETIME 등)을 지정하면 오류를 방지할 수 있습니다.
  • 시간대 고려 : 서로 다른 시간대에서 작업할 때는 CONVERT_TZ() 함수를 사용하십시오.

DATE_ADD와 INTERVAL 절을 적용하면 실제 작업에서 날짜 연산을 효율적으로 간소화할 수 있습니다. 다음 섹션에서는 7. 참고사항 및 모범 사례를 자세히 설명합니다.

7. 참고사항 및 모범 사례

MySQL의 날짜 연산은 매우 유용하지만 실제 작업에서 사용할 때는 몇 가지 핵심 포인트와 모범 사례를 이해해야 합니다. 이 섹션에서는 주의해야 할 점과 날짜 연산을 효율적으로 사용하는 방법을 설명합니다.

참고사항

1. 데이터 유형 일관성

  • 문제 : MySQL에서는 날짜/시간 연산에 사용되는 데이터 유형(DATE, DATETIME, TIMESTAMP 등)에 따라 결과가 달라질 수 있습니다.
  • 예시 :
    SELECT DATE_ADD('2025-01-01', INTERVAL 1 DAY); -- Valid operation
    SELECT DATE_ADD('Invalid Date', INTERVAL 1 DAY); -- Returns NULL for an invalid date
    
  • 대응책 : 입력 데이터가 올바른 형식인지 사전에 검증하고 적절한 데이터 유형을 선택하십시오.

2. 잘못된 날짜 처리

  • 문제 : 월말이나 윤년을 포함한 계산은 까다로운 경계 사례를 만들 수 있습니다.
  • 예시 :
    SELECT DATE_ADD('2025-01-31', INTERVAL 1 MONTH); -- Result: 2025-02-28
    

이 경우 MySQL이 자동으로 조정하지만, 결과가 의도한 것과 다를 수 있습니다.

  • 대응책 : 월말 날짜를 처리할 때는 LAST_DAY() 함수를 사용하여 확인하십시오.
    SELECT LAST_DAY('2025-01-31') + INTERVAL 1 MONTH;
    

3. 시간대 고려사항

  • 문제 : 서버 시간대가 애플리케이션 시간대와 다르면 데이터 불일치나 예상치 못한 결과가 발생할 수 있습니다.
  • 예시 :
    SELECT NOW(); -- Depends on the server timezone
    
  • 대응책 : 시간대를 명시적으로 설정하십시오.
    SELECT CONVERT_TZ(NOW(), 'SYSTEM', '+09:00'); -- Convert to Japan time
    

4. 복잡한 계산에서의 성능

  • 문제 : 복잡한 날짜 계산이 포함된 쿼리는 실행 속도에 영향을 줄 수 있습니다.
  • 대응책 : 불필요한 계산을 줄이고 인덱스를 활용해 쿼리를 최적화하십시오.

모범 사례

1. 표준 형식 사용

  • 날짜 형식을 일관되게 유지하십시오.
  • 권장 형식: YYYY-MM-DD (DATE), YYYY-MM-DD HH:MM:SS (DATETIME).
  • 예시 :
    SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
    

2. 함수들을 효과적으로 결합하기

  • DATE_ADD/DATE_SUB와 LAST_DAY 또는 CURDATE를 결합하면 보다 유연한 계산이 가능합니다.
  • 예시 :
    SELECT LAST_DAY(DATE_ADD(CURDATE(), INTERVAL 1 MONTH));
    

3. 동적 날짜 연산을 신중히 계획하기

  • 동적 날짜를 사용할 때는 쿼리를 분할하고 단계별로 처리하십시오.
  • 예시 :
    SET @next_month = DATE_ADD(CURDATE(), INTERVAL 1 MONTH);
    SELECT LAST_DAY(@next_month);
    

4. 시간대를 안전하게 관리하기

  • 서버와 클라이언트 간에 시간대를 일관되게 유지하십시오.
  • 예시 :
    SET time_zone = '+09:00';
    

5. 테스트 환경에서 검증하기

  • 복잡한 날짜 계산 및 다양한 시간대에 걸친 계산을 사전에 테스트하십시오.

날짜 연산에서 흔히 발생하는 실수 피하기

날짜 연산은 데이터베이스 설계와 쿼리 정확도에 큰 영향을 미치는 중요한 기술입니다. 함정을 이해하고 모범 사례를 따르면 문제를 예방하고 효율적인 데이터 처리를 달성할 수 있습니다.

8. FAQ

여기에는 MySQL 날짜 연산에 대한 자주 묻는 질문(FAQ)이 있습니다. 이 답변들은 초급에서 중급 사용자들이 흔히 궁금해하는 공통적인 사항에 초점을 맞춥니다.

Q1: DATE_ADD와 INTERVAL와 함께 + 연산자를 사용하는 것의 차이점은 무엇인가요?

A1:

  • DATE_ADD()은 날짜 계산을 위한 전용 함수이며 오류 처리와 형 변환에 더 유리합니다.
  • + INTERVAL은 간단하지만 경우에 따라 형 변환 오류가 발생할 수 있습니다.

Example: Using DATE_ADD:

SELECT DATE_ADD('2025-01-01', INTERVAL 1 DAY);

Example: Using + operator with INTERVAL:

SELECT '2025-01-01' + INTERVAL 1 DAY;

일반적으로 DATE_ADD()를 사용하는 것이 권장됩니다.

Q2: DATE_ADD로 한 번에 여러 INTERVAL을 추가할 수 있나요?

A2:
아니요. DATE_ADD()는 한 번에 하나의 INTERVAL만 지정할 수 있습니다. 하지만 여러 DATE_ADD() 호출을 중첩하여 동일한 효과를 얻을 수 있습니다.

Example: Add multiple intervals:

SELECT DATE_ADD(DATE_ADD('2025-01-01', INTERVAL 1 DAY), INTERVAL 1 MONTH);

Q3: MySQL에서 날짜 형식을 어떻게 변경하나요?

A3:
DATE_FORMAT() 함수를 사용하여 날짜/시간을 원하는 형식으로 포맷할 수 있습니다.

Example: Format conversion:

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_date;

Result: 2025-01-01 12:30:45

Q4: 월말 날짜에 1개월을 더하면 어떻게 되나요?

A4:
MySQL이 자동으로 조정하여 결과는 다음 달의 마지막 날이 됩니다.

Example:

SELECT DATE_ADD('2025-01-31', INTERVAL 1 MONTH);

Result: 2025-02-28

이 동작은 편리하지만, 의도한 로직과 일치하는지 확인해야 합니다.

Q5: 시간대 인식을 고려한 날짜 계산은 어떻게 하나요?

A5:
MySQL의 CONVERT_TZ() 함수를 사용하여 시간대를 지정할 수 있습니다.

Example: Convert from UTC to Japan time:

SELECT CONVERT_TZ('2025-01-01 12:00:00', 'UTC', '+09:00') AS japan_time;

Q6: DATE_ADD에 잘못된 날짜를 지정하면 어떻게 되나요?

A6:
잘못된 날짜(예: 2025-02-30)를 지정하면 MySQL은 NULL을 반환합니다.

Example:

SELECT DATE_ADD('2025-02-30', INTERVAL 1 DAY);

Result: NULL

입력값을 사전에 검증하는 것이 권장됩니다.

Q7: 과거 또는 미래 날짜를 기준으로 조건을 설정하려면 어떻게 하나요?

A7:
DATE_ADD 또는 DATE_SUB를 사용해 기준 날짜를 계산한 뒤, 그 결과를 WHERE 절에 활용합니다.

Example: Retrieve data from the past 30 days:

SELECT * 
FROM sales
WHERE sale_date >= CURDATE() - INTERVAL 30 DAY;

Q8: 여러 시간대를 사용할 때의 모범 사례는 무엇인가요?

A8:

  • 모든 datetime 데이터를 UTC로 저장합니다.
  • 필요에 따라 클라이언트 측에서 원하는 시간대로 변환합니다.

Example: Save data in UTC:

SET time_zone = '+00:00';

Q9: MySQL에서 날짜와 시간을 별도로 다룰 수 있나요?

A9:
예. DATE() 또는 TIME()을 사용해 날짜 부분 또는 시간 부분만 추출할 수 있습니다.

Example 1: Extract date only:

SELECT DATE(NOW());

Example 2: Extract time only:

SELECT TIME(NOW());

Q10: MySQL의 INTERVAL 절에서 지원되지 않는 단위를 사용할 수 있나요?

A10:
MySQL은 제한된 INTERVAL 단위만 지원합니다. 다른 단위가 필요하면 적절한 지원 단위로 변환해서 사용해야 합니다.

9. Summary

MySQL에서 날짜 작업은 데이터베이스 설계와 운영에 필수적인 기술입니다. DATE_ADD, DATE_SUB 및 INTERVAL 절을 활용하면 복잡한 날짜 계산을 쉽고 효율적으로 수행할 수 있습니다.

Key Takeaways

  1. 날짜/시간 타입의 기본 :
  • MySQL에서는 DATE, DATETIME, TIMESTAMP와 같은 날짜/시간 타입을 올바르게 사용해야 합니다.
  1. DATE_ADD 및 DATE_SUB :
  • 날짜를 더하거나 빼는 데 편리한 함수이며, 간단한 구문으로 유연하게 작업할 수 있습니다.
  1. INTERVAL 절 :
  • 연, 월, 일, 시간 등 다양한 단위를 사용해 효율적인 날짜 계산을 할 수 있는 핵심 도구입니다.
  1. 실용적인 예제 :
  • 과거/미래 데이터 추출, 만료일 관리, 알림 설정 등 다양한 활용 사례에 유용합니다.
  1. 주의사항 및 모범 사례 :
  • UTC 저장, 입력값 검증, 시간대 변환 등을 통해 정확하고 일관된 날짜 처리를 유지합니다.

  • 데이터 유형 일관성, 시간대 영향, 월말 조정과 같은 고려 사항을 이해하는 것이 중요합니다.

  1. FAQ :
  • 초보자들이 흔히 겪는 질문과 문제에 대한 구체적인 해결책을 제공했습니다.

다음 단계

  • 배운 내용을 적용하기 :
  • DATE_ADD와 DATE_SUB를 자신의 프로젝트에 사용해 날짜 연산을 연습해 보세요.
  • 시간대를 고려한 설계 :
  • 여러 시간대에서 운영되는 데이터베이스에서는 정확한 시간대 관리와 날짜 계산이 중요합니다.
  • 추가 최적화 :
  • 효율적인 쿼리를 설계하고 성능을 고려한 인덱스를 사용하여 데이터 작업을 개선하세요.

MySQL 날짜 연산을 마스터하면 데이터 관리 및 분석 효율성이 크게 향상됩니다. 이 글을 참고 자료로 활용하고 실무에 이러한 실용적인 기술을 적극 적용하세요.