web-dev-qa-db-fra.com

PENDANT LA BOUCLE avec IF STATEMENT MYSQL

Je voudrais créer une routine stockée pour MySQL qui calcule le nombre de jours ouvrables ou ouvrables pour un mois (les jours ouvrables sont du lundi au vendredi).

C'est une erreur de syntaxe mais je ne sais pas ce qu'est l'erreur de syntaxe. Tout ce qu'il me dit c'est:

1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'WHILE (@daycount <@totaldays) DO IF (WEEKDAY (@checkweekday) <6) THEN' à la ligne 2

Mon erreur de syntaxe est la suivante:

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

Mon code:

      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;

Est-ce que quelqu'un peut aider?

UPDATE Je reçois la même erreur avec le bit de code suivant, donc cela a probablement quelque chose à voir avec ceci:

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

J'ai découvert que vous ne pouvez pas avoir de conditions en dehors de la procédure stockée dans mysql. C'est pourquoi l'erreur de syntaxe. Dès que j'ai mis le code dont j'avais besoin entre

   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

Juste pour les autres :

Si vous ne savez pas comment créer une routine dans phpmyadmin, vous pouvez le mettre dans la requête SQL

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

Exécutez la requête. Cela créera une procédure stockée ou une routine stockée nommée test2. Maintenant, allez dans l'onglet routines et modifiez la procédure stockée pour qu'elle soit ce que vous voulez. Je suggère également de lire http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/ si vous commencez avec des procédures stockées.

La fonction first_day dont vous avez besoin est: Comment obtenir le premier jour de chaque mois correspondant dans mysql?

Montrer que la procédure fonctionne Ajoutez simplement la ligne suivante sous END WHILE et au-dessus END

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

Utilisez ensuite le code suivant dans la fenêtre de requête SQL.

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

REMARQUE: Si vous l'utilisez, gardez à l'esprit que ce code ne tient pas compte des jours fériés observés au niveau national (ou des jours fériés d'ailleurs).

21
scrfix