2013-06-17 14 views
12

Ich möchte eine gespeicherte Routine für MySQL erstellen, die die Anzahl der Geschäftstage oder Arbeitstage für einen Monat (Arbeitstage sind Montag bis Freitag) ermittelt.WHILE LOOP mit IF-Anweisung MYSQL

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; Sie in die Bedienungsanleitung zu Ihrer MySQL-Server-Version für die richtige Syntax entspricht in der Nähe zu verwenden 'WHILE (@daycount < @totaldays) DO IF (WEEKDAY (@checkweekday) < 6) THEN' in Zeile 2

Meine Syntaxfehler ist in der 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; 

ist jemand in der Lage zu helfen?

UPDATE ich den gleichen Fehler mit dem folgenden Stück Code erhalten, 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; 
+0

Haben Sie eine Funktion 'FIRST_DAY()'? –

+1

Ja, das tue ich. Der Webhost hat diese Funktion tatsächlich automatisch. Ich schrieb mein eigenes und erkannte, dass es funktioniert, wenn ich die Funktion ohne meine benutze. Der first_day() ist nicht der Fehlerort. Es passiert es ohne Probleme. – scrfix

Antwort

15

ich, dass Sie nicht conditionals außerhalb der gespeicherten Prozedur entdeckt haben, haben in mysql. Deshalb der Syntaxfehler. Sobald ich den Code legen, das ich zwischen

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 benötigt für andere:

Wenn Sie nicht sicher sind, wie eine Routine in phpMyAdmin erstellen Sie diese in der SQL-Abfrage setzen können

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, http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/ zu lesen, wenn Sie mit gespeicherten Prozeduren beginnen.

Die first_day Funktion, die Sie brauchen, ist: How to get first day of every corresponding month in mysql?

die Prozedur zeigt, arbeitet einfach die folgende Zeile unter END WHILE hinzufügen und über END

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

dann den folgenden Code in der Verwendung SQL-Abfragefenster

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

HINWEIS: Wenn Sie dies bitte beachten Sie, dass dieser Code nicht in nimmt national beobachtet Feiertage zu berücksichtigen (oder alle Ferien für diese Angelegenheit).