我想提取两个日期之间每个日期的计数(@ 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 ;
谢谢你的帮助。 丹尼尔
答案 0 :(得分: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 ;
答案 1 :(得分: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 ;