MySQL에서는 종종 '2025-07-22'처럼 날짜처럼 보이지만 실제로는 문자열(String)로 저장된 데이터를 만나게 된다. 이 데이터를 진짜 날짜로 바꿔야 날짜 비교, 정렬, 필터링이 제대로 동작한다. 이때 가장 많이 쓰는 함수가 STR_TO_DATE()이며, 간단한 경우에는 CAST()로도 처리가 가능하다. 실무에서는 외부 엑셀 업로드, CSV 입력값, API 연동 데이터 처리에서 매우 자주 사용된다.

STR_TO_DATE() 함수란?
STR_TO_DATE() 함수는 문자열을 날짜 또는 시간 형식으로 변환해주는 함수다. 내부적으로 포맷 문자열을 지정해서 원하는 형식으로 정확히 바꿔야 한다.
기본 문법
STR_TO_DATE(string, format)
문자열과 해당 문자열의 포맷을 정확하게 지정해줘야 변환이 성공한다.
예제: 기본 날짜 변환
SELECT STR_TO_DATE('2025-07-22', '%Y-%m-%d');
-- 결과: 2025-07-22 (DATE 형식)
이제 '2025-07-22'는 문자열이 아닌 날짜로 처리되므로 조건 비교, 정렬, 필터링에 문제가 없다
자주 사용하는 포맷 코드
| 코드 | 의미 | 예시 |
| %Y | 4자리 연도 | 2025 |
| %y | 2자리 연도 | 25 |
| %m | 2자리 월 | 07 |
| %d | 2자리 일 | 22 |
| %H | 24시간제 시 | 13 |
| %i | 분 | 45 |
| %s | 초 | 30 |
| %p | AM/PM | AM, PM |
예제: 날짜 + 시간 변환
SELECT STR_TO_DATE('2025-07-22 14:30:00', '%Y-%m-%d %H:%i:%s');
-- 결과: 2025-07-22 14:30:00
이제 DATETIME으로 바뀌었기 때문에 NOW(), CURDATE() 같은 시스템 시간과 직접 비교 가능하다
예제: 사용자 입력값 처리 (엑셀/CSV)
SELECT STR_TO_DATE(user_input, '%d/%m/%Y') AS 표준형_날짜
FROM uploads;
사용자가 22/07/2025처럼 영국식 또는 비표준 포맷으로 입력한 데이터를 표준 DATE 형식으로 바꿔준다
예제: 요일 포함된 포맷 처리
SELECT STR_TO_DATE('Tuesday 2025-07-22', '%W %Y-%m-%d');
-- 결과: 2025-07-22
%W를 활용해 요일 정보가 포함된 문자열도 처리할 수 있다
CAST()로 간단하게 날짜 변환하기
CAST() 함수는 문자열을 명시적으로 다른 데이터 타입으로 바꿔주는 MySQL의 표준 SQL 문법 함수다. 날짜 포맷이 MySQL 내부 기본 포맷일 때만 사용 가능하다
SELECT CAST('2025-07-22' AS DATE);
-- 결과: 2025-07-22
이처럼 간단한 형식이면 STR_TO_DATE() 대신 사용할 수 있다. 하지만 복잡한 포맷에서는 CAST()로 변환이 불가능하다
실무 예제: 문자열 날짜 비교
SELECT *
FROM events
WHERE STR_TO_DATE(event_date_text, '%Y%m%d') >= CURDATE();
'20250722'처럼 붙어 있는 날짜 문자열을 DATE로 바꿔 오늘 날짜와 비교한다. 이처럼 STR_TO_DATE()는 데이터 클렌징 필수 함수로 활용된다
실무 예제: 시간 비교 필터링
SELECT *
FROM logs
WHERE STR_TO_DATE(log_time_str, '%H:%i:%s') BETWEEN '09:00:00' AND '18:00:00';
로그에서 '14:25:30'과 같은 문자열 시간을 TIME 형식으로 바꾸고, 근무 시간대 필터링에 활용할 수 있다
STR_TO_DATE 사용 시 주의사항
- 포맷 문자열이 실제 데이터와 완벽히 일치해야 한다. 한 글자라도 다르면 NULL 반환됨
- 변환 실패시 오류 없이 NULL로 처리되므로, 실무에서는 IS NULL 조건으로 실패 데이터 추출 가능
- 문자열 데이터가 비정형이면 사전 가공 또는 정규식으로 정리한 후 적용하는 것이 좋다
언제 STR_TO_DATE, 언제 CAST?
| 조건 | 추천 함수 |
| 포맷이 복잡함 | STR_TO_DATE |
| 문자열 형식이 yyyy-mm-dd임 | CAST 또는 STR_TO_DATE 모두 가능 |
| 날짜+시간 조합 문자열 | STR_TO_DATE |
| 엑셀/CSV 외부 입력 처리 | STR_TO_DATE |
기본 형식이면 CAST도 가능하지만, 실무에서는 거의 항상 STR_TO_DATE가 안정적이다
정리
- STR_TO_DATE()는 문자열을 날짜 또는 시간으로 변환할 때 사용하는 MySQL 함수다
- 포맷 문자열을 정확하게 지정해야 정상 변환되며, 형식이 다르면 NULL을 반환한다
- CAST()는 내부 기본 포맷(YYYY-MM-DD)일 때만 간단하게 쓸 수 있다
- 외부 데이터 정제, API 파싱, 조건 비교 등에서 STR_TO_DATE는 매우 자주 사용된다
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_str-to-date
https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast
'DB' 카테고리의 다른 글
| [MySQL] ABS, CEIL, FLOOR로 절댓값과 반올림 처리하기 (1) | 2025.07.24 |
|---|---|
| [MySQL] 실무에서 자주 쓰는 날짜/시간 함수 조합 예제 모음 (2) | 2025.07.23 |
| [MySQL] LAST_DAY, MAKEDATE, MAKETIME 등 특수 날짜 생성 함수 (1) | 2025.07.23 |
| [MySQL] WEEK, MONTH, QUARTER, YEARWEEK 등 기간 단위 함수 모음 🗓️ (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_FORMAT, TIME_FORMAT 사용법 완전 정복 📅 (1) | 2025.07.22 |