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

MySQL에서 월 기준 몇 번째 주인지 구하는 방법

MySQL에 월(月) 단위 주차 계산 함수가 내장되어 있나요?

결론부터 말하자면, MySQL에는 특정 날짜가 그 달의 몇 번째 주에 해당하는지를 바로 반환하는 표준 내장 함수는 존재하지 않습니다. 하지만 WEEK(), DATE_SUB(), DAYOFMONTH() 함수를 조합하면 원하는 결과를 손쉽게 얻을 수 있습니다.

기본 문법

월 기준 주차를 계산하는 기본적인 SQL 문법은 다음과 같습니다.

SELECT WEEK(yourDateColumnName, 5) -
WEEK(DATE_SUB(yourDateColumnName, INTERVAL DAYOFMONTH(yourDateColumnName) - 1 DAY), 5) + 1 AS anyAliasName FROM yourTableName;

이 쿼리의 핵심 원리는 다음과 같습니다. 먼저 해당 날짜 자체의 연중 주차를 구하고, 같은 달 1일의 연중 주차를 뺀 뒤 1을 더해주면 그 달 기준의 주차가 계산됩니다. 여기서 WEEK(date, 5)의 모드 값 5는 월요일을 한 주의 시작으로 간주합니다.

예제 테이블 생성

문법을 실제로 이해하기 위해 예제 테이블을 만들어 보겠습니다. 테이블 생성 쿼리는 아래와 같습니다.

mysql> create table FirstWeekOfMonth
   -> (
   -> Id int NOT NULL AUTO_INCREMENT primary key,
   -> yourdate date
   -> );
Query OK, 0 rows affected (2.50 sec)

샘플 데이터 입력

이제 INSERT 명령어를 사용해 테이블에 날짜 데이터를 몇 개 삽입해 보겠습니다.

mysql> insert into FirstWeekOfMonth(yourdate) values('2019-01-18');
Query OK, 1 row affected (0.20 sec)
mysql> insert into FirstWeekOfMonth(yourdate) values('2019-04-19');
Query OK, 1 row affected (0.19 sec)
mysql> insert into FirstWeekOfMonth(yourdate) values('2019-05-20');
Query OK, 1 row affected (0.10 sec)
mysql> insert into FirstWeekOfMonth(yourdate) values('2019-12-31');
Query OK, 1 row affected (0.19 sec)
mysql> insert into FirstWeekOfMonth(yourdate) values('2019-10-05');
Query OK, 1 row affected (0.12 sec)
mysql> insert into FirstWeekOfMonth(yourdate) values('2019-08-25');
Query OK, 1 row affected (0.16 sec)

저장된 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select *from FirstWeekOfMonth;

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

+----+------------+
| Id | yourdate   |
+----+------------+
|  1 | 2019-01-18 |
|  2 | 2019-04-19 |
|  3 | 2019-05-20 |
|  4 | 2019-12-31 |
|  5 | 2019-10-05 |
|  6 | 2019-08-25 |
+----+------------+
6 rows in set (0.00 sec)

월 기준 주차 조회 쿼리 실행

이제 앞서 소개한 공식을 적용하여 각 날짜가 해당 월의 몇 번째 주인지 확인해 보겠습니다.

mysql> SELECT WEEK(yourdate, 5) -
   -> WEEK(DATE_SUB(yourdate, INTERVAL DAYOFMONTH(yourdate) - 1 DAY), 5) + 1 as FirstWeekDemo from FirstWeekOfMonth;

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

+---------------+
| FirstWeekDemo |
+---------------+
|             3 |
|             3 |
|             4 |
|             6 |
|             1 |
|             4 |
+---------------+
6 rows in set (0.00 sec)

결과 해석

위 출력 결과를 샘플 데이터와 대조해 보면 논리를 쉽게 이해할 수 있습니다. 예를 들어 2019-10-05는 10월 1일(화요일)이 포함된 첫 주 이후의 첫 번째 완전한 주에 해당하므로 1로 계산되고, 2019-01-18은 1월 기준 세 번째 주로 계산됩니다. 이처럼 WEEK 함수의 모드 옵션과 날짜 연산 함수를 조합하면 MySQL에서도 월 기준 주차를 정확하게 산출할 수 있습니다.