MySQL에서 특정 날짜가 속한 주의 월요일을 구하고 싶다면 DATE_FORMAT() 함수를 활용할 수 있습니다. 이번 글에서는 문자열로 저장된 날짜 데이터에서 요일에 해당하는 일수를 빼고, 그 결과를 요일 이름과 함께 표시하는 방법을 단계별로 알아보겠습니다.
1. 예제 테이블 생성하기
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable1820 ( AdmissionDate varchar(20) ); Query OK, 0 rows affected (0.00 sec)
2. 날짜 데이터 삽입하기
insert 명령어를 사용해 테이블에 여러 개의 날짜 레코드를 입력합니다. 날짜는 '일/월/년' 형식의 문자열로 저장됩니다.
mysql> insert into DemoTable1820 values('20/10/2019');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1820 values('19/12/2018');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1820 values('16/04/2017');
Query OK, 1 row affected (0.00 sec)
3. 저장된 레코드 확인하기
select 문으로 테이블에 저장된 전체 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1820;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+---------------+ | AdmissionDate | +---------------+ | 20/10/2019 | | 19/12/2018 | | 16/04/2017 | +---------------+ 3 rows in set (0.00 sec)
4. 요일을 뺀 날짜를 요일 이름과 함께 표시하는 쿼리
이제 핵심 쿼리를 살펴보겠습니다. 아래 쿼리는 각 날짜에서 WEEKDAY() 값만큼 일수를 빼서 해당 주의 월요일을 구하고, 이를 요일 약자와 함께 형식화하여 출력합니다.
mysql> select DATE_FORMAT(SUBDATE(STR_TO_DATE(AdmissionDate,'%d/%m/%y'), WEEKDAY(STR_TO_DATE(AdmissionDate,'%d/%m/%y'))), '%a %d %b') from DemoTable1820;
실행 결과는 다음과 같습니다.
+-------------------------------------------------------------------------------------------------------------------------+ | DATE_FORMAT(SUBDATE(STR_TO_DATE(AdmissionDate,'%d/%m/%y'), WEEKDAY(STR_TO_DATE(AdmissionDate,'%d/%m/%y'))), '%a %d %b') | +-------------------------------------------------------------------------------------------------------------------------+ | Mon 19 Oct | | Mon 14 Dec | | Mon 13 Apr | +-------------------------------------------------------------------------------------------------------------------------+ 3 rows in set, 6 warnings (0.00 sec)
쿼리 동작 원리 살펴보기
각 함수가 어떤 역할을 하는지 정리하면 다음과 같습니다.
- STR_TO_DATE(AdmissionDate, '%d/%m/%Y') : '20/10/2019'처럼 저장된 문자열을 MySQL이 인식할 수 있는 날짜 타입으로 변환합니다.
- WEEKDAY() : 해당 날짜의 요일을 숫자로 반환합니다. 월요일은 0, 화요일은 1, ... 일요일은 6입니다.
- SUBDATE(날짜, WEEKDAY값) : 날짜에서 요일 번호만큼 빼므로, 항상 해당 주의 월요일(주의 시작일)이 됩니다.
- DATE_FORMAT(..., '%a %d %b') : 결과를 '%a'(요일 약자), '%d'(일), '%b'(월 약자) 형태로 포맷팅합니다. 예를 들어 'Mon 19 Oct'처럼 출력됩니다.
결국 세 개의 서로 다른 날짜(2019-10-20, 2018-12-19, 2017-04-16)가 모두 각각 속한 주의 월요일인 'Mon 19 Oct', 'Mon 14 Dec', 'Mon 13 Apr'로 변환되어 표시된 것을 확인할 수 있습니다.
참고 팁: 위 예제에서는 네 자리 연도(2019 등)를 다루므로 형식 지정자를 '%d/%m/%Y'(대문자 Y)로 작성하는 것이 더 안전합니다. 소문자 '%y'는 두 자리 연도를 의미하기 때문에 경고(warning)가 발생할 수 있습니다. 또한 컬럼 별칭(alias)을 지정하면 결과 헤더가 더 깔끔하게 표시됩니다.