3

2 つの日付 (@sdate、@edate) の間のすべての日付のカウントを抽出したいのですが、すべての日ではなく最終日のカウントしか得られません。

すべての結果を出力するにはどうすればよいですか? これが私のストアドプロシージャです。

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 ;

助けてくれてありがとう。ダニエル

4

2 に答える 2

0

一時テーブルを使用してみてください。ここにそれについての良い答えがあります。

このようなものが機能する可能性があります:

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 ;
于 2012-09-19T11:41:58.593 に答える
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 ;
于 2012-09-19T11:42:18.137 に答える