web-dev-qa-db-ja.com

IFステートメントMYSQLを使用したループ

MySQLのストアドルーチンを作成して、1か月の営業日または就業日数を計算します(就業日は月曜日から金曜日です)。

構文エラーですが、構文エラーが何なのかわかりません。それは私に言うだけです:

1064-SQL構文にエラーがあります。使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルで、 'WHILE(@daycount <@totaldays)DO IF(WEEKDAY(@checkweekday)<6)THEN'の2行目で確認してください。

私の構文エラーは次のとおりです。

    WHILE(@daycount < @totaldays) DO
          IF (WEEKDAY(@checkweekday) < 6) THEN

私のコード:

      SELECT MONTH(CURDATE()) INTO @curmonth;
      SELECT MONTHNAME(CURDATE()) INTO @curmonthname;
      SELECT DAY(LAST_DAY(CURDATE())) INTO @totaldays;
      SELECT FIRST_DAY(CURDATE()) INTO @checkweekday;
      SELECT DAY(@checkweekday) INTO @checkday;
      SET @daycount = 0;
      SET @workdays = 0;

    BEGIN
      WHILE(@daycount < @totaldays) DO
          IF (WEEKDAY(@checkweekday) < 6) THEN
            SET @workdays = @workdays+1;
          END IF;
          SET @daycount = @daycount+1;
          SELECT ADDDATE('@checkweekday', INTERVAL 1 DAY) INTO @checkweekday;
      END WHILE;
    END;
    SELECT @workdays;

誰かが支援できますか?

[〜#〜] update [〜#〜]次のコードで同じエラーが表示されるので、おそらくこれと関係があります。

    SET @workdays = 0;
    IF (WEEKDAY('2013-06-13') < 6) THEN
      SET @workdays = @workdays+1;
    END IF;
    SELECT @workdays;
18
scrfix

Mysqlのストアドプロシージャの外部に条件を設定できないことを発見しました。これが構文エラーの理由です。間に必要なコードを入れるとすぐに

   BEGIN
   SELECT MONTH(CURDATE()) INTO @curmonth;
   SELECT MONTHNAME(CURDATE()) INTO @curmonthname;
   SELECT DAY(LAST_DAY(CURDATE())) INTO @totaldays;
   SELECT FIRST_DAY(CURDATE()) INTO @checkweekday;
   SELECT DAY(@checkweekday) INTO @checkday;
   SET @daycount = 0;
   SET @workdays = 0;

     WHILE(@daycount < @totaldays) DO
       IF (WEEKDAY(@checkweekday) < 5) THEN
         SET @workdays = @workdays+1;
       END IF;
       SET @daycount = @daycount+1;
       SELECT ADDDATE(@checkweekday, INTERVAL 1 DAY) INTO @checkweekday;
     END WHILE;
   END

他の人のためだけに

Phpmyadminでルーチンを作成する方法がわからない場合は、これをSQLクエリに含めることができます

    delimiter ;;
    drop procedure if exists test2;;
    create procedure test2()
    begin
    select ‘Hello World’;
    end
    ;;

クエリを実行します。これにより、test2という名前のストアドプロシージャまたはストアドルーチンが作成されます。次に、[ルーチン]タブに移動し、ストアドプロシージャを編集して必要なものにします。また、ストアドプロシージャで開始する場合は、 http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/ を読むことをお勧めします。

必要なfirst_day関数は次のとおりです。 mysqlで対応するすべての月の初日を取得する方法?

プロシージャが機能していることを示すEND WHILEおよびENDの上に次の行を追加するだけです

    SELECT @curmonth,@curmonthname,@totaldays,@daycount,@workdays,@checkweekday,@checkday;

次に、SQLクエリウィンドウで次のコードを使用します。

    call test2 /* or whatever you changed the name of the stored procedure to */

注:これを使用する場合、このコードは全国的に観察される祝日(またはそのことに関する祝日)を考慮に入れないことに注意してください。

21
scrfix