2013-06-17 10 views
12

Mi piacerebbe creare una routine memorizzata per MySQL che calcoli il numero di giorni lavorativi o lavorativi per un mese (i giorni lavorativi sono dal lunedì al venerdì).WHILE LOOP con IF STATEMENT MYSQL

È un errore di sintassi, tuttavia non so quale sia l'errore di sintassi. Tutto quello che mi dice è:

1064 - Si ha un errore nella sintassi SQL; controllare il manuale che corrisponde alla versione del server MySQL per la sintassi diritto di utilizzare vicino 'mentre (@daycount < @totaldays) FARE SE (giorno della settimana (@checkweekday) < 6) POI' at line 2

la mia Errore di sintassi è la seguente:

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

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

è qualcuno in grado di assistere?

UPDATE ricevo lo stesso errore con il seguente pezzo di codice in modo che probabilmente ha qualcosa a che fare con questo:

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

Hai una funzione 'FIRST_DAY()'? –

+1

Sì, sì. Il webhost ha effettivamente quella funzione automaticamente. Ho scritto il mio e ho capito che quando uso la funzione senza la mia funziona ancora. Il primo_giorno() non è dove l'errore è comunque. Lo passa senza problemi. – scrfix

risposta

15

ho scoperto che non si può avere condizionali al di fuori della stored procedure in mysql. Questo è il motivo per cui l'errore di sintassi. Appena ho messo il codice che mi serviva tra

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 

Solo per gli altri:

Se non siete sicuri di come creare una routine in phpMyAdmin si può mettere questo nella query SQL

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

Eseguire la query. Ciò creerà una stored procedure o una stored procedure denominata test2. Ora vai alla scheda routine e modifica la stored procedure per essere quello che vuoi. Suggerisco anche di leggere http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/ se stai iniziando con le stored procedure.

La funzione first_day che vi serve è: How to get first day of every corresponding month in mysql?

dimostrare la procedura sta lavorando È sufficiente aggiungere la seguente riga sotto END WHILE e sopra FINE

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

Quindi utilizzare il seguente codice nella SQL Query Window.

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

NOTA: Se si utilizza questo si prega di tenere presente che questo codice non tiene in conto delle festività osservate a livello nazionale (o qualsiasi festività per quella materia).