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

MySQL DAY() 함수와 CASE 문으로 DATE 열의 월별 N번째 주 구하기

날짜 데이터가 해당 월의 몇 번째 주에 속하는지 구해야 하는 경우가 있습니다. 즉, 1일부터 7일까지는 1주차, 8일부터 14일까지는 2주차, 15일부터 21일까지는 3주차로 계산하는 방식입니다. 이때 MySQL의 DAY() 함수를 사용해 일(day) 값을 추출하고, CASE 문으로 조건을 설정하여 주차(숫자)를 구할 수 있습니다.

예제 테이블 생성

먼저 예제로 사용할 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
(
    AdmissionDate date
);
Query OK, 0 rows affected (0.63 sec)

레코드 삽입

insert 명령을 사용하여 테이블에 여러 레코드를 삽입합니다.

mysql> insert into DemoTable values('2019-09-12');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values('2019-09-06');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('2019-09-26');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('2019-09-30');
Query OK, 1 row affected (0.14 sec)

전체 레코드 조회

select 문을 사용하여 테이블의 모든 레코드를 확인합니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다.

+---------------+
| AdmissionDate |
+---------------+
| 2019-09-12    |
| 2019-09-06    |
| 2019-09-26    |
| 2019-09-30    |
+---------------+
4 rows in set (0.00 sec)

월의 N번째 주를 구하는 쿼리

다음은 각 날짜가 해당 월의 몇 번째 주에 속하는지 구하는 쿼리입니다.

mysql> select
(
   CASE WHEN DAY(AdmissionDate) BETWEEN 1 AND 7 THEN 1
        WHEN DAY(AdmissionDate) BETWEEN 8 AND 14 THEN 2
        WHEN DAY(AdmissionDate) BETWEEN 15 AND 21 THEN 3
        WHEN DAY(AdmissionDate) BETWEEN 22 AND 28 THEN 4
        else 5
        end
) as NthWeekDayOfMonth
from DemoTable;

실행 결과는 다음과 같습니다.

+-------------------+
| NthWeekDayOfMonth |
+-------------------+
|                 2 |
|                 1 |
|                 4 |
|                 5 |
+-------------------+
4 rows in set (0.01 sec)

쿼리 동작 원리

위 쿼리의 핵심 로직을 살펴보면 다음과 같습니다.

  • DAY(AdmissionDate): 날짜 값에서 '일' 부분만 추출합니다. 예를 들어 2019-09-12라면 12를 반환합니다.
  • BETWEEN 조건: 추출된 일 값이 어느 범위에 속하는지 판단합니다. 1~7일은 1주차, 8~14일은 2주차, 15~21일은 3주차, 22~28일은 4주차로 분류됩니다.
  • ELSE 5: 29일, 30일, 31일처럼 앞의 조건에 해당하지 않는 날짜는 5주차로 처리합니다.

결과를 보면 2019-09-12는 12일이므로 2주차(2), 2019-09-06은 6일이므로 1주차(1), 2019-09-26은 26일이므로 4주차(4), 2019-09-30은 30일이므로 5주차(5)로 정확하게 출력되는 것을 확인할 수 있습니다. 이 방식을 응용하면 특정 주차에 해당하는 데이터만 필터링하거나, 주차별 통계를 집계하는 쿼리도 손쉽게 작성할 수 있습니다.