MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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日まで進んだためです。

  1. JavaでMySQLのSELECTクエリにPreparedStatement(プリペアドステートメント)を使う方法

    executeQuery()メソッドの基本的な使い方JavaからMySQLに対してSELECTクエリを実行する場合は、PreparedStatementオブジェクトのexecuteQuery()メソッドを使用します。基本構文は以下の通りです。yourPreparedStatementObject = yourConnectionObject.prepareStatement(yourQueryName);yourResultSetObject = yourPreparedStatementObject.executeQuery();それでは、実際にサンプルデータベース「sample」を使って手

  2. Pythonのwhileループとは?仕組みと基本構文をわかりやすく解説

    while文は、Pythonをはじめとする多くのプログラミング言語で広く使われているループ処理の構文です。条件式が真(True)である限り、同じブロック内の処理を繰り返し実行し続けます。本記事では、whileループの基本的な仕組みと実際の使い方を解説します。while文の基本構文while文の一般的な書き方は以下の通りです。while 条件式: 処理1 処理2 ...コロン「:」の後にインデント(字下げ)して記述されたブロック内の文は、条件式がTrueである限り何度でも繰り返し実行されます。Pythonではインデントによってコードのブロックを表すため、インデントの深さを