MySQL에서 날짜 데이터 중에서 연도만, 월만, 시간만, 또는 요일만 따로 추출하고 싶을 때 어떤 함수를 써야 할까? 이럴 때는 DATE(), TIME(), YEAR(), MONTH(), DAY(), HOUR() 등 다양한 추출 함수들을 적절히 활용하면 된다.

DATE() 함수 - 날짜만 추출하기
DATETIME 타입에서 날짜만 따로 추출할 수 있는 함수다. 예를 들어 2025-07-22 14:20:30에서 2025-07-22만 뽑아올 수 있다
SELECT DATE('2025-07-22 14:20:30');
-- 결과: 2025-07-22
주로 WHERE 조건절에서 날짜 비교용으로 사용되며 CURDATE()와 함께 자주 쓰인다
SELECT * FROM orders
WHERE DATE(order_date) = CURDATE();
TIME() 함수 - 시간만 추출하기
DATE()가 날짜만 뽑는다면, TIME() 함수는 시간만 추출한다. 2025-07-22 14:20:30에서 14:20:30을 추출할 수 있다
SELECT TIME('2025-07-22 14:20:30');
-- 결과: 14:20:30
로그 테이블에서 특정 시간대의 데이터를 분석할 때 유용하다
SELECT * FROM access_logs
WHERE TIME(access_time) BETWEEN '14:00:00' AND '15:00:00';
YEAR(), MONTH(), DAY() 함수
날짜 데이터에서 연도/월/일을 개별적으로 추출할 수 있다. 이 세 가지 함수는 집계 통계 작업에서 매우 자주 사용된다
SELECT
YEAR('2025-07-22') AS 연도,
MONTH('2025-07-22') AS 월,
DAY('2025-07-22') AS 일;
-- 결과: 2025 | 7 | 22
예를 들어 연도별 주문 건수를 집계할 수 있다
SELECT YEAR(order_date) AS order_year, COUNT(*) AS cnt
FROM orders
GROUP BY order_year;
혹은 월별 매출 통계를 구할 수도 있다
SELECT MONTH(order_date) AS order_month, SUM(amount) AS total
FROM orders
WHERE YEAR(order_date) = 2025
GROUP BY order_month;
HOUR(), MINUTE(), SECOND() 함수
시간 단위로도 세분화하여 데이터를 추출할 수 있다. 하루 24시간 기준으로 통계 데이터를 볼 때 자주 사용된다
SELECT
HOUR('14:20:30') AS 시,
MINUTE('14:20:30') AS 분,
SECOND('14:20:30') AS 초;
-- 결과: 14 | 20 | 30
예제: 접속 시간대별 유입 수 분석
SELECT HOUR(login_time) AS hour, COUNT(*) AS login_count
FROM user_logins
GROUP BY hour;
DAYOFWEEK(), DAYNAME() 함수 - 요일 추출
날짜에서 요일을 추출하고 싶은 경우도 많다. 예를 들어 쇼핑몰에서 주말 방문자 수를 분석하거나, 특정 요일에만 프로모션을 적용하고 싶을 때 사용할 수 있다
SELECT DAYOFWEEK('2025-07-22'); -- 결과: 3 (일요일=1, 월요일=2, …)
SELECT DAYNAME('2025-07-22'); -- 결과: Tuesday
실무에서는 요일별로 트래픽 분석 시 유용하다
SELECT DAYNAME(visit_time) AS 요일, COUNT(*) AS 방문자수
FROM page_views
GROUP BY 요일;
실무 활용 팁
- DATE(created_at) = CURDATE()와 같이 추출 함수는 인덱스를 무시할 수 있으므로 성능이 중요한 쿼리에서는 BETWEEN이나 >= 방식이 더 좋다
- YEAR()나 MONTH()로 그룹핑할 때는 GROUP BY와 ORDER BY에 함께 사용하면 보기 좋고 정렬도 자연스럽다
- 날짜 필드가 NULL일 수 있는 경우, IFNULL()이나 COALESCE()로 처리해주는 습관도 중요하다
집계 + 추출 함수 조합 예제
SELECT
YEAR(order_date) AS 년도,
MONTH(order_date) AS 월,
COUNT(*) AS 주문건수,
SUM(total_price) AS 매출합계
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2025-12-31'
GROUP BY 년도, 월
ORDER BY 년도, 월;
위 쿼리는 최근 2년치 주문 데이터를 연도-월 기준으로 집계하는 가장 실무적인 예제 중 하나다
정리
- DATE(): 날짜만 추출
- TIME(): 시간만 추출
- YEAR(), MONTH(), DAY(): 연도, 월, 일 추출
- HOUR(), MINUTE(), SECOND(): 시간 단위 추출
- DAYOFWEEK(), DAYNAME(): 요일 추출
이 함수들은 MySQL 날짜 데이터 처리의 기본 중의 기본이며, 실무에서 시간 기반 필터링이나 통계 작업을 위해 반드시 익혀야 한다
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
'DB' 카테고리의 다른 글
| [MySQL] UNIX_TIMESTAMP, FROM_UNIXTIME 변환 함수 정리 🔄 (1) | 2025.07.23 |
|---|---|
| [MySQL] ADDDATE, SUBDATE, DATE_ADD, DATE_SUB 활용법 📆 (1) | 2025.07.23 |
| [MySQL] DATEDIFF, TIMEDIFF로 날짜/시간 차이 계산하기 (0) | 2025.07.23 |
| [MySQL] DATE_FORMAT, TIME_FORMAT 사용법 완전 정복 📅 (1) | 2025.07.22 |
| [MySQL] NOW와 CURDATE로 현재 날짜/시간 구하기 🕒 (0) | 2025.07.22 |
| [MySQL] 실무에서 자주 쓰는 숫자 함수 조합 예제 모음 (2) | 2025.07.22 |
| [MySQL] 숫자형 변환 함수: CAST, CONVERT로 타입 바꾸기 (0) | 2025.07.22 |
| [MySQL] 숫자 포맷 함수: FORMAT, TRUNCATE 차이와 사용법 (0) | 2025.07.22 |