2012-09-19 4 views
3

두 날짜 (@ sdate, @ edate) 사이의 모든 날짜에 대한 계산을 추출하려고하지만 모든 날에 대한 계산 만 제공합니다.MySQL 저장 proc WHILE 마지막 결과 만

어떻게 결과를 모두 출력 할 수 있습니까? 여기 내 저장된 proc입니다.

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 ; 

도움 주셔서 감사합니다. Daniel

답변

0

임시 테이블을 사용해보십시오. 약 nice answer입니다. 이 같은

뭔가 일할 수 : 당신은 모든 값을 저장하기 위해 Temporary table를 사용해야합니다

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

.

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