【问题标题】:Increased column value in one row增加一行中的列值
【发布时间】:2018-09-09 12:53:12
【问题描述】:

我有以下存储过程从 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;

输出表是

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

在第 12 个月,年份是 2018 年。应该是 2017 年,而且行 9 2017 不应该在那里,因为它是第 13 个月,包括当前月份。如何将第 12 个月的年份设为 2017 年并删除 9 2017 提前谢谢

【问题讨论】:

标签: mysql database stored-procedures


【解决方案1】:

这是一个存储过程,可以为您提供所需的输出。它比您尝试的更长但更简单。

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

【讨论】:

    【解决方案2】:

    您也可以在不创建存储过程、临时表、插入临时表并在
    之后删除存储过程的情况下执行此操作 通过在 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
    

    结果

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

    查看演示http://sqlfiddle.com/#!9/340e01/584

    请注意,如果您使用 MySQL 8.0+,则使用公用表表达式的语法会更清晰。

    查询

    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
    

    结果

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

    见演示https://www.db-fiddle.com/f/chJ4qS2ocXS79vGkFBg7PR/13

    【讨论】:

    • 因为我将在另一个查询中使用在此创建的表。存储过程中是否可以将第12个月的2018改为2017?
    • “由于我将在另一个查询中使用在此创建的表”您能否在问题@damon 中添加一个用户案例示例,然后如果您愿意,我可以将他的问题编辑为一个更好的问题。 “是否可以在存储过程中将第12个月的2018改为2017?”让我看看测试一下
    • "存储过程中是否可以将第12个月的2018改为2017?"此代码db-fiddle.com/f/hQEW2b6HUMyDw8vezinFGX/12 可能工作@damon 无法测试它它接缝服务器不允许创建存储过程。而且我现在也无法访问 MySQL 服务器进行测试。
    • 我仍然收到错误消息。如果您可以访问服务器,请检查它是否有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2022-01-20
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多