Mysql 增加一行中的列值

Mysql 增加一行中的列值,mysql,database,stored-procedures,Mysql,Database,Stored Procedures,我有以下存储过程获取MySql中从当前日期算起的最后12个月 DELIMITER $$ CREATE PROCEDURE `Calendar`() BEGIN CREATE TEMPORARY TABLE IF NOT EXISTS `Cal` ( `month` INT(11) , `year` INT(11) ); TRUNCATE TABLE Cal; SET @counter := -1; WHILE (DATEDIFF(DATE(NOW()), DATE(DATE_SUB(NOW(

我有以下存储过程获取MySql中从当前日期算起的最后12个月

DELIMITER $$
CREATE
PROCEDURE `Calendar`()
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS `Cal` (
`month` INT(11) ,
`year` INT(11) 
);
TRUNCATE TABLE Cal;

SET @counter := -1;
WHILE (DATEDIFF(DATE(NOW()), DATE(DATE_SUB(NOW(),INTERVAL @counter MONTH))) < DATEDIFF(DATE(NOW()), DATE(DATE_SUB(NOW(),INTERVAL 12 MONTH)))) DO 
INSERT INTO Cal SELECT DATE_FORMAT(DATE_ADD(DATE_SUB(NOW(),INTERVAL 12 MONTH), INTERVAL @counter:=@counter + 1 MONTH),'%m'),DATE_FORMAT(DATE_ADD(DATE_SUB(NOW(),INTERVAL 12 MONTH), INTERVAL @counter + 1 MONTH),'%Y');
END WHILE;

SELECT * FROM `Cal`;
END$$
DELIMITER ;

DROP PROCEDURE IF EXISTS Calendar;

第12个月是2018年。应为2017年,且自第13个月(包括本月)起,2017年第9行不应存在。如何将第12个月的年份设置为2017年并删除2017年的
9
提前感谢您也可以这样做,而无需创建存储过程、临时表、插入临时表并在之后删除存储过程
通过在MySQL代码中使用数字生成器

查询

SELECT 
   MONTH(NOW() - INTERVAL number_generator.number MONTH) AS `month`
 , YEAR(NOW() - INTERVAL number_generator.number MONTH) AS `year`
FROM (

 SELECT 
   (@NUMBER := @NUMBER + 1) AS number
 FROM (
    SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
  ) AS records_1
  CROSS JOIN (
    SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
  ) AS records_2
  CROSS JOIN (SELECT @NUMBER := 0) AS init_user_params  
) AS number_generator
WHERE
    number_generator.number BETWEEN 1 AND 12
  AND
    MONTH(NOW()) <> MONTH(NOW() - INTERVAL number_generator.number MONTH) 
ORDER BY 
    YEAR(NOW() - INTERVAL number_generator.number MONTH) ASC
  , MONTH(NOW() - INTERVAL number_generator.number MONTH) ASC
WITH RECURSIVE number_generator (number) AS
(
  SELECT 1 AS number
  UNION ALL
  SELECT number + 1 FROM number_generator WHERE number < 12
)
SELECT 
   MONTH(NOW() - INTERVAL number_generator.number MONTH) AS `month`
 , YEAR(NOW() - INTERVAL number_generator.number MONTH) AS `year`
FROM 
 number_generator
WHERE
 MONTH(NOW()) <> MONTH(NOW() - INTERVAL number_generator.number MONTH) 
ORDER BY 
    YEAR(NOW() - INTERVAL number_generator.number MONTH) ASC
  , MONTH(NOW() - INTERVAL number_generator.number MONTH) ASC
见演示

注意:如果您使用MySQL 8.0+,那么使用公共表表达式的语法更清晰

查询

SELECT 
   MONTH(NOW() - INTERVAL number_generator.number MONTH) AS `month`
 , YEAR(NOW() - INTERVAL number_generator.number MONTH) AS `year`
FROM (

 SELECT 
   (@NUMBER := @NUMBER + 1) AS number
 FROM (
    SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
  ) AS records_1
  CROSS JOIN (
    SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
  ) AS records_2
  CROSS JOIN (SELECT @NUMBER := 0) AS init_user_params  
) AS number_generator
WHERE
    number_generator.number BETWEEN 1 AND 12
  AND
    MONTH(NOW()) <> MONTH(NOW() - INTERVAL number_generator.number MONTH) 
ORDER BY 
    YEAR(NOW() - INTERVAL number_generator.number MONTH) ASC
  , MONTH(NOW() - INTERVAL number_generator.number MONTH) ASC
WITH RECURSIVE number_generator (number) AS
(
  SELECT 1 AS number
  UNION ALL
  SELECT number + 1 FROM number_generator WHERE number < 12
)
SELECT 
   MONTH(NOW() - INTERVAL number_generator.number MONTH) AS `month`
 , YEAR(NOW() - INTERVAL number_generator.number MONTH) AS `year`
FROM 
 number_generator
WHERE
 MONTH(NOW()) <> MONTH(NOW() - INTERVAL number_generator.number MONTH) 
ORDER BY 
    YEAR(NOW() - INTERVAL number_generator.number MONTH) ASC
  , MONTH(NOW() - INTERVAL number_generator.number MONTH) ASC

请参见演示

这里有一个存储过程,它将为您提供所需的输出。它比您尝试的要长,但更简单

DELIMITER //
DROP PROCEDURE IF EXISTS Calendar //
CREATE PROCEDURE Calendar ()
BEGIN
  DECLARE month INT DEFAULT MONTH(CURDATE());
  DECLARE year INT DEFAULT YEAR(CURDATE()) - 1;
  CREATE TEMPORARY TABLE CAL (month INT, year INT);
  REPEAT
    SET month = month + 1;
    IF (month = 13) THEN
      SET month = 1;
      SET year = year + 1;
    END IF;
    INSERT INTO CAL VALUES (month, year);
    UNTIL month = MONTH(CURDATE())
  END REPEAT;
  SELECT * FROM CAL;
  DROP TABLE CAL;
END //
DELIMITER ;
CALL Calendar();
输出:

 month  year    
 10     2017
 11     2017
 12     2017
  1     2018 
  2     2018
  3     2018
  4     2018
  5     2018
  6     2018
  7     2018
  8     2018
  9     2018

是否与:相同,因为我将在另一个查询中使用在此基础上创建的表。是否可以在存储过程中将第12个月的2018年更改为2017年?“因为我将在另一个查询中使用在此基础上创建的表”您是否可以在问题@damon中添加一个用户案例示例,然后如果您愿意,我可以将他的问题编辑为更好的问题。“是否可以在存储过程中将第12个月的2018更改为2017?”让我看看并测试“是否可以在存储过程中将第12个月的2018更改为2017?”此代码可能有效@damon无法测试它,因为服务器不允许创建存储过程。我现在也没有权限访问MySQL服务器进行测试。我仍然得到一个错误。如果您可以访问服务器,请检查它是否工作
 month  year    
 10     2017
 11     2017
 12     2017
  1     2018 
  2     2018
  3     2018
  4     2018
  5     2018
  6     2018
  7     2018
  8     2018
  9     2018