Frage WÄHREND SCHLEIFE mit IF STATEMENT MYSQL


Ich möchte eine gespeicherte Routine für MySQL erstellen, die die Anzahl der Geschäfts- oder Arbeitstage für einen Monat ermittelt (Arbeitstage sind Montag bis Freitag).

Es ist ein Syntaxfehler, aber ich weiß nicht, was der Syntaxfehler ist. Alles was es mir sagt ist:

1064 - Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, um die richtige Syntax zu verwenden   in der Nähe von 'WHILE (@daycount <@totaldays) TUN, WENN (WOCHENTAG (@checkweekday) <6)   DANN bei Zeile 2

Mein Syntaxfehler ist im Folgenden:

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

Mein 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;

Kann jemand helfen?

AKTUALISIEREN Ich bekomme den gleichen Fehler mit dem folgenden Bit Code, so dass es wahrscheinlich etwas damit zu tun hat:

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

12
2018-06-17 00:41


Ursprung


Antworten:


Ich habe festgestellt, dass Sie in mysql keine Bedingungen außerhalb der gespeicherten Prozedur haben können. Deshalb der Syntaxfehler. Sobald ich den Code eingefügt habe, den ich brauchte

   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

Nur für andere:

Wenn Sie nicht sicher sind, wie Sie eine Routine in phpmyadmin erstellen, können Sie dies in die SQL-Abfrage einfügen

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

Führen Sie die Abfrage aus. Dies erstellt eine gespeicherte Prozedur oder eine gespeicherte Routine namens test2. Wechseln Sie nun zur Registerkarte "Routinen" und bearbeiten Sie die gespeicherte Prozedur so, wie Sie es möchten. Ich empfehle auch, zu lesen http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/ wenn Sie mit gespeicherten Prozeduren beginnen.

Die Funktion first_day, die Sie benötigen, ist: Wie bekomme ich den ersten Tag eines jeden Monats in Mysql?

Das Verfahren funktioniert Fügen Sie einfach die folgende Zeile unter END WHILE und über END hinzu

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

Verwenden Sie dann den folgenden Code in dem SQL Query Window.

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

HINWEIS: Wenn Sie dies verwenden, beachten Sie bitte, dass dieser Code keine landesweit beobachteten Feiertage (oder Feiertage) berücksichtigt.


16
2018-06-18 16:41