Увеличено значение столбца в одной строке - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть следующая хранимая процедура получить последние 12 месяцев с текущей даты в MySql

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 Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вот хранимая процедура, которая даст вам желаемый результат. Это длиннее, но проще, чем вы пытались.

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
0 голосов
/ 09 сентября 2018

Вы также можете сделать это без создания хранимой процедуры, временной таблицы, вставки во временную таблицу и удаления хранимой процедуры после
Используя генератор чисел в коде 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...