Mysql 增加一行中的列值
我有以下存储过程获取MySql中从当前日期算起的最后12个月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(
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