2013-06-17 6 views
12

Bir ay boyunca iş günlerini veya iş günlerini hesaplayan MySQL için saklı bir yordam oluşturmak istiyorum (Çalışma Günleri Cuma gününden Cuma gününe kadar).IF STATEMENT ile LOOP MYSQL

Bu bir sözdizimi hatası, ancak sözdizimi hatasının ne olduğunu bilmiyorum. Tüm söyler bana:

1064 - SQL sözdiziminizde bir hata var; Doğru sözdizimi yakın kullanmak için MySQL sunucu sürümü ile uyumlu kılavuzu 'SÜRE (@daycount < @totaldays) DO IF (WEEKDAY (@checkweekday) < 6) SONRA' hattında 2

Benim dizimi Hatası takip eden yerlerde:

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

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

edebilmek birisi yardımcı olmak mı? Sana saklanan prosedürün dışında conditionals sahip olamayacağını keşfettim

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

'FIRST_DAY()' işleviniz var mı? –

+1

Evet. Webhost aslında bu işlevi otomatik olarak yapar. Kendi kendimi yazdım ve bu işlevi benim olmadan kullanmamın hala işe yaradığını fark ettim. İlk_day(), hatanın nerede olduğu değil. Problemsiz geçiyor. – scrfix

cevap

15

: Muhtemelen bu bir ilgisi vardır, böylece aşağıdaki kod bit ile aynı hatayı almaya

GÜNCELLEME mySQL. Bu yüzden sözdizimi hatası. En kısa sürede ben Sadece başkaları için

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 

arasında gerekli kodu koyduğu gibi:

Eğer SQL sorgusunda bu koyabilirsiniz phpmyadmin bir rutin oluşturmak için nasıl emin değilseniz

Sorguyu çalıştırın. Bu saklı bir prosedür veya test2 adlı depolanmış rutin yaratacaktır. Şimdi rutinler sekmesine gidin ve saklı yordamı istediğiniz gibi düzenleyin. Saklı yordamlarla başlıyorsanız, http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/'u da okumanızı öneririm.

ihtiyacınız FIRST_DAY fonksiyonudur: How to get first day of every corresponding month in mysql?

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

Sonra aşağıdaki kodu kullanabilirsiniz Basitçe SON WHILE'den altında ve END yukarıdaki aşağıdaki satırı ekleyin çalışıyor Prosedürü gösteriliyor SQL Sorgu Penceresi.

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

NOT: Bu kod ulusal gözlenen tatil (ya da bu konuda herhangi tatillerini) hesabına almak etmediğini bu lütfen unutmayın kullanın.