3

I want to extract a count for every Date between two dates (@sdate,@edate) but it gives me only the count for the last day and not for all days.

How can i output all results? Here is my stored 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 ;

Thanks for you help. Daniel

2 Answers2

0

You should try to use temporary table. Here is a nice answer about it.

Something like this could work:

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 ;
Community
  • 1
  • 1
András Ottó
  • 7,605
  • 1
  • 28
  • 38
0

You should use Temporary table to store all values.

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 ;
valex
  • 23,966
  • 7
  • 43
  • 60