날짜와 시간을 사람이 보기 좋게 표현하거나, 원하는 형식으로 가공해야 할 때 가장 많이 사용하는 함수가 바로 DATE_FORMAT()과 TIME_FORMAT()이다. 이 함수들은 MySQL에서 날짜 출력 포맷을 자유자재로 설정할 수 있게 해주며, 리포트나 통계 화면, 이메일 본문 날짜 표현 등에서 굉장히 유용하게 쓰인다

DATE_FORMAT() 함수란?
DATE_FORMAT() 함수는 날짜(DATE, DATETIME, TIMESTAMP) 값을 지정된 형식대로 문자열로 변환해주는 함수이다
기본 문법
DATE_FORMAT(date, format_string)
첫 번째 인자는 날짜 값이고, 두 번째는 포맷 형식 문자열이다. 예를 들어 '%Y-%m-%d', '%H:%i:%s' 등이 있다
주요 포맷 기호 정리
| 포맷 기호 | 설명 | 예시 값 |
| %Y | 4자리 연도 | 2025 |
| %y | 2자리 연도 | 25 |
| %m | 2자리 월 | 07 |
| %c | 1자리 월 | 7 |
| %d | 2자리 일 | 22 |
| %e | 1자리 일 | 5, 22 |
| %H | 24시간제 시 | 14 |
| %h | 12시간제 시 | 02 |
| %i | 분 | 09 |
| %s | 초 | 30 |
| %p | AM/PM | AM, PM |
| %W | 요일 (전체 이름) | Tuesday |
| %a | 요일 (짧은 이름) | Tue |
예제 1: 날짜 포맷 변경
SELECT DATE_FORMAT('2025-07-22 14:25:30', '%Y년 %m월 %d일');
-- 결과: 2025년 07월 22일
예제 2: 시간 포맷만 추출
SELECT DATE_FORMAT('2025-07-22 14:25:30', '%H:%i:%s');
-- 결과: 14:25:30
예제 3: 요일 포함 형식
SELECT DATE_FORMAT('2025-07-22', '%W (%Y-%m-%d)');
-- 결과: Tuesday (2025-07-22)
TIME_FORMAT() 함수란?
TIME_FORMAT() 함수는 시간 데이터만 포맷팅할 때 사용하며, TIME, DATETIME, TIMESTAMP 타입에서 시간 부분만 추출해 형식화한다
TIME_FORMAT(time, format_string)
주로 %H, %i, %s, %p 같은 포맷 기호를 사용한다
예제: 오후 2시를 12시간제로 표시
SELECT TIME_FORMAT('14:25:30', '%h:%i:%s %p');
-- 결과: 02:25:30 PM
실무 예제: 고객 가입일을 한국형 날짜로 표시
SELECT
user_name,
DATE_FORMAT(join_date, '%Y년 %m월 %d일 가입') AS 가입일자
FROM users;
이런 포맷은 리포트나 고객 통지 이메일에 매우 유용하다. 특히 한국어 기반 시스템에서는 년, 월, 일을 직접 포함해 가독성 높은 표현을 만들 수 있다
실무 예제: 시간대별 접속 이력 표현
SELECT
user_id,
TIME_FORMAT(login_time, '%h시 %i분 %p') AS 접속시간
FROM login_log;
12시간제와 AM/PM을 조합하면 사용자가 익숙하게 느끼는 포맷을 만들 수 있다
활용 팁
- DATE_FORMAT()은 GROUP BY나 ORDER BY와 함께 자주 사용된다. 예를 들어 월별 매출 분석 시 포맷 문자열을 사용해 보기 좋게 표현할 수 있다
- 시간대 기준 통계 화면에서는 TIME_FORMAT()으로 시각만 뽑아 가독성을 높인다
- 날짜 데이터를 포맷팅하면 **문자열(String)**로 바뀌므로, 정렬이나 비교가 필요한 경우엔 원본 날짜 필드도 함께 사용하는 것이 좋다
쿼리 예제: 월-일 기준으로 주문 건수 보기
SELECT
DATE_FORMAT(order_date, '%m월 %d일') AS 날짜,
COUNT(*) AS 주문수
FROM orders
WHERE order_date BETWEEN '2025-07-01' AND '2025-07-31'
GROUP BY 날짜
ORDER BY 날짜;
2025-07-01부터 2025-07-31 사이 주문을 월/일 기준으로 그룹화하여 보기 쉽게 출력하는 실무형 쿼리다
쿼리 예제: 오전/오후 기준 접속자 수
SELECT
IF(TIME_FORMAT(login_time, '%p') = 'AM', '오전', '오후') AS 접속구간,
COUNT(*) AS 인원수
FROM login_log
GROUP BY 접속구간;
오전/오후로 나눠서 사용자 행동 패턴을 분석할 때 활용할 수 있다
정리
- DATE_FORMAT()은 날짜와 시간을 원하는 포맷으로 문자열로 가공한다
- TIME_FORMAT()은 시간만 포맷팅할 때 유용하다
- 한국식 날짜 표현도 자유롭게 구성 가능하며, 통계/보고서/화면 표현에서 자주 활용된다
- 포맷 문자열은 %Y, %m, %d, %H, %i, %s, %p 등 다양한 조합을 지원한다
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format
'DB' 카테고리의 다른 글
| [MySQL] STR_TO_DATE와 CAST를 활용한 문자열 → 날짜 변환 (1) | 2025.07.23 |
|---|---|
| [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, TIME, YEAR 등 날짜/시간 추출 함수 모음 (0) | 2025.07.22 |
| [MySQL] NOW와 CURDATE로 현재 날짜/시간 구하기 🕒 (0) | 2025.07.22 |
| [MySQL] 실무에서 자주 쓰는 숫자 함수 조합 예제 모음 (2) | 2025.07.22 |
| [MySQL] 숫자형 변환 함수: CAST, CONVERT로 타입 바꾸기 (0) | 2025.07.22 |