반응형
Notice
Recent Posts
Recent Comments
IT 일기장
[DB] 날짜 DB 컬럼 타입 분석 본문
반응형
날짜 데이터 저장 방식은 회사의 사용 목적과 시스템의 요구 사항에 따라 다르다.
날짜를 저장하는 내가 아는 방법은 2가지가 있었는데
1. DATETIME 타입으로 사용 (년/월/일 시:분:초 통째로 저장)
2. CHAR 또는 INT 타입으로 사용 (년,월,일 시,분,초 각각 따로 저장)
어떤 방법이 개발에 유리할까?
일반적으로는 DATETIME 타입으로 사용하는 것이 더 유리하다. 그 이유는 아래에서 두 가지 방식의 장단점을 비교해본다.
DATETIME의 장점
- 하나의 필드로 날짜와 시간을 모두 저장하기 때문에 구조가 간단하고 관리가 편리
- 날짜와 시간의 형식이 DB에서 자동으로 관리되므로 입력 및 처리에서 실수 방지
- 날짜와 시간을 기준으로 쉽게 정렬하거나 비교할 수 있음
-- 날짜와 시간을 기준으로 비교
SELECT * FROM table WHERE start_datetime >= '2024-01-01 00:00:00';
-- 날짜와 시간을 기준으로 정렬
SELECT * FROM table ORDER BY start_datetime DESC;
- DB의 날짜 함수 (DATEDIFF, TIMESTAMPDIFF, DATE_ADD 등) 를 활용하여 쉽게 연산이 가능
-- TIMESTAMP 함수를 활용한 종료일과 시작일의 차이를 "일"로 표현
SELECT TIMESTAMPDIFF(DAY, start_datetime, end_datetime) AS duration_in_days FROM table;
- DATETIME은 8바이트로 날짜와 시간을 모두 저장. 저장 공간 절약
DATETIME의 단점
- 특수한 분리 조건에서는 추가 작업 필요. 예를 들어 통계에서 많이 사용하는 년,월,일이나 시,분,초별로 각각 날짜나 시간을 분리해서 사용해야 하는 경우, DB 함수를 활용해야 함
-- DATETIME 타입의 날짜와 시간을 분리하기 위해 DATE, TIME 함수를 사용
SELECT DATE(start_datetime) AS start_date, TIME(start_datetime) AS start_time FROM table;
CHAR, INT의 장점
- 개별 사용이 많을 경우 편리. 날짜와 시간을 개별적으로 저장해야 하거나, 두 필드를 완전히 독립적으로 사용하는 경우 유리.
- 날짜 또는 시간 필드만 필요할 때, 특정 필드만 저장하거나 선택해서 쓸 수 있음.
- 시간이나 년/월/일만 관리하는 데이터가 많을 경우 공간 낭비를 줄일 수 있음.
CHAR, INT의 단점
- 비교 및 정렬 복잡성 증가
-- 날짜와 시간을 기준으로 정렬할 때 두 필드를 조합해야함
SELECT * FROM table
ORDER BY CONCAT(start_date, ' ', start_time);
- 데이터 무결성 관리 필요. 날짜와 시간 형식이 올바르지 않은 데이터가 들어올 수 있음. ex) 2024-23-01 또는 28:71:00
- 공간 낭비. 년(char(4))/월(char(2))/일(char(2))시(char(2))/분(char(2))/초(char(2))을 개별적으로 저장하면 총 14바이트가 필요함.
- 날짜 및 시간 연산의 어려움
-- 두 필드를 조합하지 않고는 날짜와 시간 연산이 불가능
SELECT TIMESTAMPDIFF(SECOND, CONCAT(start_date, ' ', start_time), CONCAT(end_date, ' ', end_time)) AS duration_in_seconds FROM table;
정리하면 다음과 같다.
일반적인 경우 : DATETIME 사용. 일관성, 공간 효율성, 연산 효율성에서 모두 좋음
특수한 경우 : CHAR, INT 사용. 통계와 같은 날짜와 시간을 독립적으로 관리해야 하거나 특정 데이터를 더 많이 사용하는 경우 유리.
반응형
'프로그래밍 언어 > SQL(DB)' 카테고리의 다른 글
[DB] 데이터 타입 일괄 변경 (0) | 2025.01.16 |
---|---|
[MySQL] Cannot delete or update a parent row: a foreign key constraint fails 해결 (0) | 2024.12.30 |
[DBeaver] 대량 테스트 데이터 생성 프로시저 (dummy data) (0) | 2024.06.19 |
[HeidiSQL] db sql export (0) | 2023.03.30 |
[SQL] Error Code: 1175. You are using safe update mode and you tried to update ... (0) | 2023.03.09 |
Comments