2012-09-19 21 views
3

我想爲兩個日期(@ sdate,@ edate)之間的每個Date提取一個計數,但它只給出了最後一天的計數,而不是所有日子。MySQL存儲proc WHILE只給出最後結果

如何輸出所有結果?這是我的存儲過程。

DELIMITER $$ 
USE `cmd_storeinfo`$$ 
DROP PROCEDURE IF EXISTS `test2`$$ 
CREATE DEFINER=`USER`@`%` PROCEDURE `test2`() 
BEGIN 
    SET @sdate = (DATE_SUB(CURDATE(), INTERVAL 6 MONTH)); 
    SET @edate = (CURDATE()); 
    SET @x=''; 
    SET @Y=''; 
    WHILE @sdate <= @edate DO 
     SELECT COUNT(*) INTO @y 
     FROM cmd_storeinfo.strinfo 
     WHERE LiveDate <= @sdate AND DeinstallDate >= @sdate OR DeinstallDate IS 
      NULL AND LiveDate IS NOT NULL 
      AND CHAIN != 1 && CHAIN != 2 && CHAIN != 999 
     GROUP BY @sdate 
     SET @x = @sdate; 
     SET @sdate = (DATE_ADD(@sdate, INTERVAL 1 DAY)); 
    END WHILE; 
SELECT @x,@y; 
END$$ 
DELIMITER ; 

感謝您的幫助。 丹尼爾

回答

0

你應該嘗試使用臨時表。這是關於它的nice answer

像這樣的東西可以工作:

DELIMITER $$ 
USE `cmd_storeinfo`$$ 
DROP PROCEDURE IF EXISTS `test2`$$ 
CREATE DEFINER=`USER`@`%` PROCEDURE `test2`() 
BEGIN 
    CREATE TEMPORARY TABLE tmpTable (currentDate DATE, startDate INT); 

    SET @sdate = (DATE_SUB(CURDATE(), INTERVAL 6 MONTH)); 
    SET @edate = (CURDATE()); 
    SET @x=''; 
    SET @Y=''; 
    WHILE @sdate <= @edate DO 
     INSERT INTO tmpTable (currentDate, startDate) 
     SELECT @sdate, COUNT(*) 
     FROM cmd_storeinfo.strinfo 
     WHERE LiveDate <= @sdate AND DeinstallDate >= @sdate OR DeinstallDate IS 
      NULL AND LiveDate IS NOT NULL 
      AND CHAIN != 1 && CHAIN != 2 && CHAIN != 999 
     GROUP BY @sdate 
     SET @sdate = (DATE_ADD(@sdate, INTERVAL 1 DAY)); 
    END WHILE; 
SELECT * FROM tmpTable; 

DROP TEMPORARY TABLE IF EXISTS tmpTable; 
END$$ 
DELIMITER ; 
0

您應該使用Temporary table來存儲所有值。

DELIMITER $$ 
USE `cmd_storeinfo`$$ 
DROP PROCEDURE IF EXISTS `test2`$$ 
CREATE DEFINER=`USER`@`%` PROCEDURE `test2`() 
BEGIN 
    SET @sdate = (DATE_SUB(CURDATE(), INTERVAL 6 MONTH)); 
    SET @edate = (CURDATE()); 
    SET @x=''; 
    SET @Y=''; 
    CREATE TEMPORARY TABLE tmpTable (x datetime,y bigint); -- creating tmp table 
    WHILE @sdate <= @edate DO 
     SELECT COUNT(*) INTO @y 
     FROM cmd_storeinfo.strinfo 
     WHERE LiveDate <= @sdate AND DeinstallDate >= @sdate OR DeinstallDate IS 
      NULL AND LiveDate IS NOT NULL 
      AND CHAIN != 1 && CHAIN != 2 && CHAIN != 999 
     GROUP BY @sdate 

     SET @x = @sdate; 
     insert into tmpTable (x,y) values (@x,@y); -- inserting values 
     SET @sdate = (DATE_ADD(@sdate, INTERVAL 1 DAY)); 
    END WHILE; 
SELECT x,y from tmpTable order by x; -- output temp table results 
END$$ 
DELIMITER ; 
+0

太好了,謝謝你幫助我:-) – user1682810