MySQL에서는 연도(year), 주 번호(week), 요일(day) 세 가지 값만 있으면 해당하는 실제 날짜를 간단하게 계산할 수 있습니다. 사용자 변수와 STR_TO_DATE() 함수를 조합하면 되는데, 그 방법을 단계별로 살펴보겠습니다.
1단계: 변수에 값 설정하기
먼저 계산에 사용할 연도, 주 번호, 요일 값을 사용자 변수에 저장합니다.
mysql> SET @year=2017, @week=15, @day=4;
Query OK, 0 rows affected (0.00 sec)
위 쿼리는 변수 @year에 2017, @week에 15, @day에 4를 각각 할당합니다. 즉, "2017년 15번째 주의 네 번째 요일"에 해당하는 날짜를 찾으려는 것입니다.
2단계: STR_TO_DATE()로 날짜 계산하기
이제 아래 쿼리처럼 CONCAT()으로 문자열을 만든 후 STR_TO_DATE() 함수에 형식 지정자를 적용하면 원하는 날짜를 얻을 수 있습니다.
mysql> SELECT STR_TO_DATE(CONCAT(@year,'-',@week,'-',IF(@day=7,0,@day)), '%Y-%U-%w') AS Date;
+--------------+
| Date |
+--------------+
| 2017-04-13 |
+--------------+
1 row in set (0.00 sec)
실행 결과 2017년 15주차 목요일에 해당하는 2017-04-13이 반환됩니다.
쿼리 동작 원리
%Y: 4자리 연도 (예: 2017)%U: 일요일을 한 주의 시작으로 보는 주 번호 (00~53)%w: 요일 번호 (0=일요일, 1=월요일, ... 6=토요일)IF(@day=7,0,@day): 일부 시스템에서는 일요일을 7로 표현하지만, MySQL의%w는 일요일을 0으로 처리하므로 7을 0으로 변환해 주는 역할을 합니다.
이 방식은 로그 데이터 정리나 주간 단위 보고서 작성처럼 "연도 + 주차" 정보만 있는 데이터를 실제 날짜로 변환해야 할 때 특히 유용하게 활용할 수 있습니다.