반응형
왜 날짜/시간 처리가 중요한가?
데이터베이스를 다루는 실무에서 날짜와 시간은 빠질 수 없는 요소입니다. 예약 시스템, 통계 분석, 매출 집계, 보고서 작성 등 대부분의 업무에서 시간 정보를 다뤄야 하며, MySQL은 이를 위한 다양한 함수를 제공합니다. 하지만 함수가 워낙 많다 보니 초보자부터 숙련자까지 종종 혼동을 겪곤 합니다. 이번 글에서는 MySQL 날짜/시간 함수의 기본과 실무에서 유용하게 쓸 수 있는 패턴들을 정리해보겠습니다.
A. 날짜/시간 관련 주요 함수
NOW(), CURDATE(), CURTIME()
NOW() : 현재 날짜와 시간을 반환합니다.
SELECT NOW(); -- 2025-06-30 14:23:12CURDATE() : 현재 날짜만 반환합니다.
SELECT CURDATE(); -- 2025-06-30CURTIME() : 현재 시간만 반환합니다.
SELECT CURTIME(); -- 14:23:12
이 함수들은 로그 기록, 생성일·수정일 관리, 실시간 데이터 표시에 자주 활용됩니다.
DATE_ADD(), DATE_SUB()
날짜를 더하거나 빼고 싶을 때 사용합니다.
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);예약일 계산, 프로모션 기간 산출 등에 유용합니다.
DATEDIFF(), TIMESTAMPDIFF()
두 날짜 사이의 차이를 구할 때 사용합니다.
SELECT DATEDIFF('2025-07-10', '2025-06-30'); -- 10 SELECT TIMESTAMPDIFF(MONTH, '2025-01-01', '2025-06-30'); -- 5TIMESTAMPDIFF는 일 뿐 아니라 연도, 월, 시간 단위까지 선택할 수 있어 유연성이 큽니다.
DATE_FORMAT(), TIME_FORMAT()
날짜와 시간을 원하는 형식으로 출력할 수 있습니다.
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i'); SELECT TIME_FORMAT(CURTIME(), '%H:%i');리포트 작성, 사용자 화면 표시 시 필수적으로 쓰입니다.
UNIX_TIMESTAMP(), FROM_UNIXTIME()
유닉스 타임스탬프와 상호 변환할 때 사용됩니다.
SELECT UNIX_TIMESTAMP('2025-06-30 14:23:12'); SELECT FROM_UNIXTIME(1750000000);시스템 간 데이터 교환이나 로그 저장 시 중요합니다.
B. 자주 쓰는 패턴 모음
최근 7일간 데이터 조회
SELECT *
FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
이번 달 데이터만 가져오기
SELECT *
FROM sales
WHERE DATE_FORMAT(order_date, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m');
특정 날짜 포맷으로 출력
SELECT DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %H시 %i분');
두 날짜 간 차이 계산
SELECT DATEDIFF('2025-07-10', '2025-06-30') AS diff_days;
시간대별 방문자 수 집계
SELECT HOUR(created_at) AS hour_slot,
COUNT(*) AS visit_count
FROM visit_log
WHERE created_at >= CURDATE()
GROUP BY HOUR(created_at);
분기별 데이터 집계
SELECT QUARTER(order_date) AS quarter,
SUM(amount) AS total_sales
FROM orders
GROUP BY QUARTER(order_date);
특정 요일의 데이터만 조회
SELECT *
FROM attendance
WHERE DAYOFWEEK(work_date) = 2; -- 월요일
전월 대비 증감 계산
SELECT MONTH(order_date) AS month,
SUM(amount) AS total_sales
FROM sales
WHERE order_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 2 MONTH)
AND LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
GROUP BY MONTH(order_date);
C. 실무 팁
인덱스와 날짜 조건 함께 쓰기
WHERE 절에서 컬럼에 함수를 적용하면 인덱스를 잘 활용하지 못합니다. 가능하다면 컬럼 그대로 비교하세요.
-- 비추천 WHERE DATE(created_at) = CURDATE(); -- 추천 WHERE created_at >= CURDATE() AND created_at < CURDATE() + INTERVAL 1 DAY;
BETWEEN vs >= AND <=
- BETWEEN은 경계값을 포함하기 때문에 원하는 구간과 다를 수 있습니다. 특히 시간 단위 BETWEEN 사용 시 주의해야 합니다.
TIMEZONE 관리
- 서버의 TIMEZONE과 애플리케이션의 TIMEZONE이 다르면 데이터가 어긋날 수 있습니다. 가능하면 일관되게 관리하거나 변환 로직을 추가하세요.
DATETIME vs TIMESTAMP
- TIMESTAMP는 TIMEZONE에 따라 변동될 수 있고, DATETIME은 고정된 값으로 저장됩니다. 시스템 로직에 맞게 타입을 선택하세요.
예제 코드 모음
한 달 후 예약 확인
SELECT *
FROM reservations
WHERE reservation_date BETWEEN CURDATE()
AND DATE_ADD(CURDATE(), INTERVAL 1 MONTH);
최근 30일 매출 합계
SELECT SUM(amount)
FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
전월 매출 조회
SELECT *
FROM sales
WHERE YEAR(order_date) = YEAR(CURDATE() - INTERVAL 1 MONTH)
AND MONTH(order_date) = MONTH(CURDATE() - INTERVAL 1 MONTH);
일자별 주문 수 집계
SELECT DATE(order_date) AS order_day,
COUNT(*) AS order_count
FROM orders
GROUP BY DATE(order_date);
주석 예시:
-- 각 날짜별 주문 건수 출력
참고 링크
- https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
- https://www.w3schools.com/sql/func_mysql_date_format.asp
MySQL 날짜/시간 함수는 방대하지만, 실무에서 자주 쓰는 것들부터 익히면 효율적으로 활용할 수 있습니다.
반응형
'Programing > SQL' 카테고리의 다른 글
| GROUP BY, WHERE와 HAVING의 차이(SQL Basics Explained) (2) | 2025.07.03 |
|---|---|
| WHERE 절과 JOIN에서의 쿼리 순서, 정말 중요할까? (0) | 2025.06.30 |
| Mockaroo로 대용량 테스트 데이터 쉽게 생성하기 (4) | 2025.06.30 |
| SQL :: ORACLE :: 오라클 지우기 (0) | 2008.12.01 |
| SQL :: ORACLE :: 오라클 :: 자동증가값 :: 시퀸스 :: SEQUENCE (1) | 2008.11.30 |
| SQL :: ORACLE :: 오라클 :: 사용자 계정 생성하기 (0) | 2008.11.30 |
| SQL :: 보안 관리 :: 끄적임 (0) | 2008.11.26 |
| SQL :: ORACLE :: 휴지인스턴스 (0) | 2008.11.24 |