Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

날짜에서 요일을 뺀 후 요일 이름과 함께 표시하는 MySQL 쿼리 방법

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)을 지정하면 결과 헤더가 더 깔끔하게 표시됩니다.