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에서도 월 기준 주차를 정확하게 산출할 수 있습니다.