MySQL에서 IF 문으로 WHILE 루프 구현하기
MySQL에서는 저장 프로시저(Stored Procedure) 안에서 WHILE 루프와 IF 문을 조합하여 반복 처리 로직을 손쉽게 구현할 수 있습니다. 이번 글에서는 현재 달의 모든 날짜를 하루씩 검사하면서 주말을 제외한 평일(월요일~금요일)의 개수를 계산하는 실전 예제를 통해 그 방법을 단계별로 살펴보겠습니다.
1. 저장 프로시저 생성하기
아래는 WHILE 루프와 IF 문을 함께 사용하는 저장 프로시저를 생성하는 쿼리입니다:
mysql> DELIMITER // mysql> create procedure sp_getDaysDemo() -> BEGIN -> SELECT MONTH(CURDATE()) INTO @current_month; -> SELECT MONTHNAME(CURDATE()) INTO @current_monthname; -> SELECT DAY(LAST_DAY(CURDATE())) INTO @total_numberofdays; -> SELECT CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE)INTO @check_weekday; -> SELECT DAY(@check_weekday) INTO @check_day; -> SET @count_days = 0; -> SET @workdays = 0; -> -> WHILE(@count_days < @total_numberofdays) DO -> IF (WEEKDAY(@check_weekday) < 5) THEN -> SET @workdays = @workdays+1; -> END IF; -> SET @count_days = @count_days+1; -> SELECT ADDDATE(@check_weekday, INTERVAL 1 DAY) INTO @check_weekday; -> END WHILE; -> -> select @current_month,@current_monthname,@total_numberofdays,@check_weekday,@check_day; -> END -> -> // Query OK, 0 rows affected (0.24 sec) mysql> delimiter ;
2. 프로시저 동작 원리
@current_month,@current_monthname: CURDATE() 함수로 현재 월의 숫자 값과 이름을 각각 저장합니다.@total_numberofdays: LAST_DAY() 함수를 활용해 해당 월의 총 일수를 구합니다.@check_weekday: 검사 대상 날짜로, 매월 1일부터 시작하여 하루씩 증가합니다.- WHILE 루프: 검사한 일수(
@count_days)가 총 일수에 도달할 때까지 반복 실행됩니다. - IF 문: WEEKDAY() 함수의 반환값이 5 미만이면(즉, 월요일~금요일) 평일 카운터인
@workdays를 1 증가시킵니다.
3. 저장 프로시저 호출하기
생성된 저장 프로시저는 CALL 명령어로 호출할 수 있으며, 기본 문법은 다음과 같습니다:
CALL yourStoredProcedureName();
위에서 만든 프로시저는 다음 쿼리로 호출합니다:
mysql> call sp_getDaysDemo();
4. 실행 결과 확인
+----------------+--------------------+---------------------+----------------+------------+ | @current_month | @current_monthname | @total_numberofdays | @check_weekday | @check_day | +----------------+--------------------+---------------------+----------------+------------+ | 1 | January | 31 | 2019-02-01 | 1 | +----------------+--------------------+---------------------+----------------+------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.02 sec)
실행 결과를 보면 현재 월 숫자(1), 월 이름(January), 해당 월의 총 일수(31일), 마지막으로 검사한 날짜 등이 정상적으로 출력되는 것을 확인할 수 있습니다. 이처럼 WHILE 루프와 IF 문을 조합하면 날짜 기반의 복잡한 반복 계산도 저장 프로시저 하나로 깔끔하게 처리할 수 있습니다.