2013-06-17 33 views
12

Chciałbym utworzyć przechowywaną procedurę dla MySQL, która określa liczbę dni roboczych lub roboczych w miesiącu (Dni robocze to od poniedziałku do piątku).PODCZAS PĘTLI, JEŚLI ZNAJDUJE SIĘ MYSQL

Jest to błąd składniowy, ale nie wiem, jaki jest błąd składni. Wszystko mi mówi:

1064 - Masz błąd w składni SQL; należy sprawdzić podręcznika, który odpowiada twojej wersji serwera MySQL dla prawego składnię używaną pobliżu 'while (@daycount < @totaldays) DO IF (DZIEŃ.TYG (@checkweekday) < 6) Then' at line 2

Moja błąd składni jest w następujących przypadkach:

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

mój kod:

 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; 

Czy ktoś w stanie pomóc?

UPDATE otrzymuję ten sam błąd z poniższego fragmentu kodu, więc prawdopodobnie ma coś wspólnego z tym:

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

Czy masz funkcję "FIRST_DAY()"? –

+1

Tak, robię. Serwer internetowy faktycznie ma tę funkcję automatycznie. Napisałem swój własny i zdałem sobie sprawę, że gdy używam funkcji bez mojej nadal działa. Funkcja first_day() nie jest tam, gdzie jest błąd. Przekazuje go bez problemu. – scrfix

Odpowiedz

15

Odkryłem, że nie można mieć warunkowe poza procedurze przechowywanej w mysql. Właśnie dlatego błąd składni. Jak tylko umieścić kod, że muszę między

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 

Tylko dla innych:

Jeżeli nie jesteś pewien, jak stworzyć rutynę w phpMyAdmin można umieścić to w zapytaniu SQL

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

Uruchom zapytanie. Spowoduje to utworzenie procedury składowanej lub przechowywanej procedury o nazwie test2. Teraz przejdź do zakładki rutyny i edytuj procedurę przechowywaną, aby była tym, czego potrzebujesz. Sugeruję również czytanie http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/, jeśli zaczynasz od procedur przechowywanych.

Funkcja first_day czego potrzebujesz to: How to get first day of every corresponding month in mysql?

przedstawienie procedury pracuje Wystarczy dodać następującą linię poniżej końca podczas przede KONIEC

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

Następnie należy użyć następującego kodu w Okno zapytania SQL.

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

UWAGA: Jeśli używasz tego należy pamiętać, że ten kod nie bierze się na konto obserwowane na poziomie krajowym świąt (lub jakiekolwiek wakacje dla tej sprawy).