MySQLでIF文を使いながらWHILEループを実装する方法
MySQLでは、ストアドプロシージャの中でWHILEループとIF文を組み合わせることで、条件分岐を伴う繰り返し処理を実装できます。本記事では、「当月の日数を1日ずつチェックし、平日(営業日)の数をカウントする」サンプルを通じて、具体的な実装手順を解説します。
ストアドプロシージャの作成
ストアドプロシージャを作成する際は、ステートメントの区切り文字を一時的に変更するため、最初にDELIMITER //を指定します。以下が作成用のクエリです。
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;
-> -- 当月1日の日付を生成
-> 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 ;
処理のポイント
- @current_month / @current_monthname:
MONTH()関数とMONTHNAME()関数で、現在の月の番号と名称を取得します。 - @total_numberofdays:
LAST_DAY()で当月の最終日を求め、DAY()で「何日あるか」を数値として取り出します。 - @check_weekday:
DATE_FORMAT(NOW(), '%Y-%m-01')により、当月1日の日付を生成します。 - WHILEループ: カウンタ変数
@count_daysが当月の総日数に達するまで、対象日を1日ずつ進めながら処理を繰り返します。 - IF文:
WEEKDAY()関数の戻り値が5未満(月曜=0〜金曜=4)の場合に、営業日として@workdaysをインクリメントします。
WEEKDAY()は月曜日を0、日曜日を6として返すため、「5未満」という条件で月曜から金曜のみを判定できる点がポイントです。
ストアドプロシージャの呼び出し方
作成したストアドプロシージャは、CALLコマンドで実行します。基本の構文は以下のとおりです。
CALL yourStoredProcedureName();
今回作成したプロシージャであれば、次のように呼び出します。
mysql> CALL sp_getDaysDemo();
実行結果
+----------------+--------------------+---------------------+----------------+------------+
| @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日であることが確認できます。また、ループ内で平日の数は@workdaysに順次加算されていきます。@check_weekdayが「2019-02-01」と表示されるのは、ループ処理の過程で日付が翌月1日まで進んだためです。
-
JavaでMySQLのSELECTクエリにPreparedStatement(プリペアドステートメント)を使う方法
executeQuery()メソッドの基本的な使い方JavaからMySQLに対してSELECTクエリを実行する場合は、PreparedStatementオブジェクトのexecuteQuery()メソッドを使用します。基本構文は以下の通りです。yourPreparedStatementObject = yourConnectionObject.prepareStatement(yourQueryName);yourResultSetObject = yourPreparedStatementObject.executeQuery();それでは、実際にサンプルデータベース「sample」を使って手
-
Pythonのwhileループとは?仕組みと基本構文をわかりやすく解説
while文は、Pythonをはじめとする多くのプログラミング言語で広く使われているループ処理の構文です。条件式が真(True)である限り、同じブロック内の処理を繰り返し実行し続けます。本記事では、whileループの基本的な仕組みと実際の使い方を解説します。while文の基本構文while文の一般的な書き方は以下の通りです。while 条件式: 処理1 処理2 ...コロン「:」の後にインデント(字下げ)して記述されたブロック内の文は、条件式がTrueである限り何度でも繰り返し実行されます。Pythonではインデントによってコードのブロックを表すため、インデントの深さを