
이게 도대체 뭐가 다른 거야? 🤯
MySQL을 쓰다 보면 DATE, DATETIME, TIMESTAMP 중 어떤 걸 써야 할지 헷갈릴 때가 많다.
오늘은 이 세 가지 타입의 차이점과 특징, 변환 방식, 실전 사용 팁까지 모두 정리해보자.
✅ 1. 기본 정의
자료형 | 설명 | 저장 범위 | 시간 포함 여부 | 타임존 영향 |
DATE | 날짜만 저장 | 1000-01-01 ~ 9999-12-31 |
❌ (시간 없음) | ❌ |
DATETIME | 날짜 + 시간 저장 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
✅ | ❌ |
TIMESTAMP | 날짜 + 시간 저장 (UNIX 기반) | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC |
✅ | ✅ (타임존 영향 받음) |
💡 핵심 정리
- DATE: 연/월/일만 필요할 때
- DATETIME: 연/월/일/시간/분/초를 저장하되, 타임존에 민감하지 않은 절대 시간
- TIMESTAMP: UTC 기준 상대 시간이며, 타임존에 따라 값이 변할 수 있음
🕐 2. 저장 예시 및 출력 형태
-- DATE
INSERT INTO table (col) VALUES ('2024-05-15');
-- DATETIME
INSERT INTO table (col) VALUES ('2024-05-15 14:30:00');
-- TIMESTAMP
INSERT INTO table (col) VALUES (CURRENT_TIMESTAMP);
타입 | 저장 값 | 출력 형태 |
DATE | 2024-05-15 | ‘YYYY-MM-DD’ |
DATETIME | 2024-05-15 14:30:00 | ‘YYYY-MM-DD HH:MM:SS’ |
TIMESTAMP | 2024-05-15 14:30:00 | ‘YYYY-MM-DD HH:MM:SS’ (시스템 타임존 기준 변동 가능) |
🌍 3. 타임존(Timezone) 차이
DATETIME은 타임존을 무시
→ 그냥 문자처럼 시간 정보를 저장함. MySQL 서버의 타임존이 바뀌어도 값은 그대로.
TIMESTAMP는 타임존 영향을 받음
→ 내부적으로 UTC로 저장되고, 서버나 세션 타임존 설정에 따라 출력 값이 바뀔 수 있음
-- 타임존 확인
SELECT @@global.time_zone, @@session.time_zone;
-- 타임존 변경
SET time_zone = '+09:00';
❗ 주의: 타임존이 중요한 글로벌 서비스라면
TIMESTAMP + UTC로 통일하는 게 안정적이다!
🔁 4. 변환(형 변환) 방법
DATE <–> DATETIME
-- DATE → DATETIME
SELECT CAST('2024-05-15' AS DATETIME);
-- 결과: 2024-05-15 00:00:00
-- DATETIME → DATE
SELECT DATE('2024-05-15 13:45:00');
-- 결과: 2024-05-15
DATETIME ↔ TIMESTAMP
-- DATETIME → TIMESTAMP (타임존 고려)
SELECT CONVERT_TZ('2024-05-15 13:45:00', '+00:00', '+09:00');
-- TIMESTAMP → DATETIME (단순 출력은 같지만 내부 로직 다름)
SELECT CAST(NOW() AS DATETIME);
📊 5. 날짜 추출 함수 활용법
함수 | 설명 | 예시 |
YEAR(col) | 연도 추출 | YEAR(created_at) → 2025 |
MONTH(col) | 월 추출 | MONTH(created_at) → 5 |
DAY(col) | 일 추출 | DAY(created_at) → 15 |
DATE(col) | 날짜만 추출 (시간 제거) | DATE(created_at) → ‘2025-05-15’ |
TIME(col) | 시간만 추출 | TIME(created_at) → ‘14:30:00’ |
✅ DATE, DATETIME, TIMESTAMP 모두 추출 가능!
→ 하지만 DATE에는 TIME() 쓰면 NULL!
🧠 6. 언제 어떤 타입을 써야 할까?
상황 | 추천 타입 | 이유 |
생일, 기념일 저장 | DATE | 시간 필요 없음 |
주문 시간, 결제 시간 | DATETIME | 시간은 중요하지만 타임존 고려하지 않음 |
로그인 기록, 글로벌 트래픽 기록 | TIMESTAMP | UTC 기반, 타임존 계산이 정확함 |
🔐 보너스: 자동 입력 타임스탬프 설정
-- created_at: 삽입 시 자동 입력
-- updated_at: 수정 시 자동 갱신
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
🧾 정리 한 줄 요약!
타입 | 날짜 | 시간 | 타임존 영향 | 추천 사용처 |
DATE | ✅ | ❌ | ❌ | 생일, 단순 날짜 |
DATETIME | ✅ | ✅ | ❌ | 주문 기록, 예약 시스템 |
TIMESTAMP | ✅ | ✅ | ✅ | 로그인 로그, 서버 트래픽, 글로벌 앱 |
이제 더 이상 DATE, DATETIME, TIMESTAMP에서 헤매지 말자!
'DB > SQL' 카테고리의 다른 글
SQL - 20250604 (1) | 2025.06.04 |
---|---|
SQL - 20250515 (2) | 2025.05.15 |
SQL - 20250514 (0) | 2025.05.14 |
SQL - 20250513 (2) | 2025.05.13 |
SQL - 20250508 (0) | 2025.05.08 |