데이터 분석에서 시간(Date/Time)은 가장 많이 사용되는 데이터 중 하나입니다.
예를 들어 다음과 같은 질문을 자주 하게 됩니다.
- 오늘 가입한 사용자는 몇 명일까?
- 지난 7일 동안 매출은 얼마나 증가했을까?
- 로그는 몇 시에 가장 많이 발생할까?
이러한 분석을 하기 위해서는
SQL에서 날짜와 시간을 정확하게 다루는 방법을 알아야 합니다.
특히 로그 데이터, 거래 데이터, 사용자 행동 데이터는
대부분 시간 기준으로 저장됩니다.
이번 글에서는 데이터 분석에서 자주 사용하는
날짜/시간 데이터 타입과 함수들을 정리하고
MySQL, PostgreSQL, Oracle 3대 DBMS의
날짜·시간 처리 방법을 비교해보겠습니다.
참고: MySQL 9.5 공식문서 - Date and Time Data Types
MySQL :: MySQL 9.5 Reference Manual :: 13.2 Date and Time Data Types
13.2 Date and Time Data Types The date and time data types for representing temporal values are DATE, TIME, DATETIME, TIMESTAMP, and YEAR. Each temporal type has a range of valid values, as well as a “zero” value that may be used when you specify an i
dev.mysql.com
1. 날짜/시간 데이터 타입
| Data Type | 예시 | 설명 |
| DATE | "2025-10-22" | 연-월-일 |
| TIME | "14:30:00" | 시:분:초 |
| DATETIME | "2025-10-22 14:30:00" | 날짜 + 시간 |
| TIMESTAMP | "2025-10-22 14:30:00" | UTC로 저장, 표시 시 타임존 변환 |
| YEAR | "2025" | 연도 |
- MySQL
TIMESTAMP는 자동으로 타임존 변환 - PostgreSQL
TIMESTAMP WITH TIME ZONE (timestamptz) 지원 - Oracle
DATE 타입에 날짜 + 시간이 모두 포함
DATETIME vs TIMESTAMP 차이
DATETIME
- 입력한 값 그대로 저장
- 타임존 영향 없음
TIMESTAMP
- 내부적으로 UTC로 저장
- 조회 시 서버 타임존으로 변환
예시: 2025-10-22 14:00:00
TIMESTAMP 저장
UTC 기준으로 저장 → 조회 시 변환
그래서 로그 데이터나 이벤트 기록처럼
시간 정확도가 중요한 데이터에는
TIMESTAMP 타입이 많이 사용됩니다.
2. 날짜/시간 데이터 입력 및 추출
현재 시간 관련 함수
-- MySQL / PostgreSQL
SELECT CURRENT_DATE, CURRENT_TIMESTAMP, NOW();
-- Oracle
SELECT SYSDATE, SYSTIMESTAMP FROM DUAL;
문자열 ↔ 날짜 변환
1. 표준 SQL 문법
-- MySQL / PostgreSQL / Oracle
SELECT CAST('2025-10-22' AS DATE); #CAST("문자열" AS 데이터타입)
2. DBMS별 TYPE() 단축 문법
-- MySQL
SELECT DATE('2025-10-22'), TIME('14:30:00'), DATETIME('2025-10-22 14:30:00');
-- PostgreSQL / Oracle
SELECT DATE '2025-10-22', TIMESTAMP '2025-10-22 15:00:00';
3. 커스텀 형식 지정
-- MySQL
SELECT STR_TO_DATE('22-10-2025', '%d-%m-%Y');
-- PostgreSQL / Oracle
SELECT TO_DATE('22-10-2025', 'DD-MM-YYYY');
날짜/시간 단위 추출
-- MySQL
SELECT YEAR(date), MONTH(date), DAY(date), HOUR(time);
-- PostgreSQL / Oracle
SELECT EXTRACT(YEAR FROM CURRENT_TIMESTAMP);
날짜 컬럼에서 연도/월을 추출할 때,
문자열 함수(substring)를 사용하여 가능하지만 권장되지 않습니다.
날짜 포맷 변환
-- MySQL
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
-- PostgreSQL
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD');
-- Oracle
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD');
MySQL DATE_FORMAT() 표
※ DATE_FORMAT()에는 매우 많은 포맷이 있지만
실무에서 가장 많이 사용하는 것은 다음과 같습니다.
| Specifier | 예시 |
| %Y-%m-%d | 2025-10-22 |
| %H:%i:%s | 14:30:00 |
| %Y-%m | 2025-10 |
| %W | Monday |
| %Y-%m-%d %H:%i:%s | 2025-10-22 14:30:00 |
3. 날짜 연산 (계산하기)
날짜 더하기 / 빼기
-- MySQL
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
SELECT DATE_SUB(NOW(), INTERVAL 3 HOUR);
-- PostgreSQL
SELECT CURRENT_DATE + INTERVAL '7 days';
-- Oracle
SELECT SYSDATE + 7 FROM DUAL;
날짜 차이 구하기
-- MySQL
SELECT DATEDIFF('2025-12-31', '2025-10-22'),
TIMEDIFF('2025-12-31 14:30:00', '2025-12-31 15:30:00');
-- PostgreSQL
SELECT AGE('2025-12-31', '2025-10-22');
-- Oracle
SELECT SYSDATE - TO_DATE('2025-10-22','YYYY-MM-DD') FROM DUAL;
4. 상황별 날짜/시간 관련 유용한 함수
| 상황 | MySQL | PostgreSQL | Oracle |
| 분기 추출 | QUARTER(date) | EXTRACT(QUARTER FROM date) | TO_CHAR(date, 'Q') |
SQL에서 날짜와 시간은
데이터 분석, 로그 분석, 매출 분석 등에서
가장 많이 사용하는 데이터 유형입니다.
특히 다음 함수들은 실무에서 매우 자주 사용됩니다.
NOW()
DATE_FORMAT()
DATE_ADD()
DATEDIFF()
EXTRACT()
SQL을 활용한 데이터 분석을 한다면 반드시 익혀두는 것이 좋습니다.
참고 자료
MySQL 9.5 공식문서, " Date and Time Data Types", https://dev.mysql.com/doc/refman/9.5/en/date-and-time-types.html
가사키 나카토, 데이터 분석을 위한 SQL 레시피, 윤인성, 한빛미디어,2024, p59-86
'데이터 분석 > SQL' 카테고리의 다른 글
| SQL CASE WHEN 완벽 정리: 사용법, 예제, 실행순서까지 (초보자 필수 문법) (0) | 2026.02.28 |
|---|---|
| SQL IN vs OR 차이점 완벽 정리 (초보자도 이해하는 사용법과 실무 기준) (0) | 2026.02.26 |
| SQL 집합 연산 완전 정리: JOIN, UNION, INTERSECT, EXCEPT, SEMI JOIN까지 (0) | 2026.02.26 |
| MYSQL로 배우는 비트 마스킹: 숫자 안에 숨어 있는 데이터 구조 해석하기 (0) | 2025.10.14 |