использование строковых значений для оператора между в mysql - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть таблица sales с атрибутами как salesId,salesDate,..etc. Столбец salesId представляет собой varchar. Мне нужно преобразовать значение year для salesDate в salesId на основе условия month для salesDate. Мне нужно сделать это для диапазона около 100 salesID. Например: old salesId = 7 и соответствующий salesDate = '2018-05-07', затем требуется новый salesId = '7/2018-2019' Итак, я попробовал следующее:

    update sales
set salesId = case
                when month(salesDate)>=4 then concat(salesId,concat("/",year(salesDate),"-",year(salesDate)+1))
                else
                    concat(salesId,concat("/",year(salesDate)-1,"-",year(salesDate)))
                end
where cast(salesId as unsigned) between "7" and "10";

Однако я получаю следующую ошибку:

Error Code: 1292. Truncated incorrect INTEGER value: '1/17-18'

Я даже пытался без использования Cast() как

    update sales
set salesId = case
                when month(salesDate)>=4 then concat(salesId,concat("/",year(salesDate),"-",year(salesDate)+1))
                else
                    concat(salesId,concat("/",year(salesDate)-1,"-",year(salesDate)))
                end
where salesId between "7" and "10";  

, но в этом случае запрос работает нормально, но я получаю:

0 row(s) affected Rows matched: 0  Changed: 0  Warnings: 0

Я могу ' t выяснить ошибку или как поступить. Может кто-нибудь дать какие-то рекомендации по этому вопросу? Спасибо. Пример данных

salesId salesDate
7          2017-05-15
8          2017-06-16
9          2017-07-18
10         2017-08-20

...

Required Result

 salesId                  salesDate
    7/2017-2018         2017-05-15
    8/2017-2018         2017-06-16
    9/2017-2018         2017-07-18
    10/2016-2017        2017-02-20

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Ошибка, которую я получил раньше, на самом деле была предупреждением, как указано здесь . Так что после использования обновления игнорировать я смог выполнить запрос как получить ожидаемые результаты. Однако я бы ждал более полного ответа, чтобы заставить его работать без необходимости игнорировать. Спасибо

0 голосов
/ 04 апреля 2020

Поле salesId должно иметь текст, подобный

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

 update sales
set salesId = case
                when month(salesDate)>=4 then concat(SUBSTRING_INDEX(salesId,'/',1),concat("/",year(salesDate),"-",year(salesDate)+1))
                else
                    concat(SUBSTRING_INDEX(salesId,'/',1),concat("/",year(salesDate)-1,"-",year(salesDate)))
                end
where cast(SUBSTRING_INDEX(salesId,'/',1) as unsigned) between "7" and "10";

, поэтому что ваша функция обновления может работать

CREATE TABLE sales (
  `salesId` VARCHAR(20),
  `salesDate` VARCHAR(10)
);

INSERT INTO sales
  (`salesId`, `salesDate`)
VALUES
  ('7', '2017-05-15'),
  ('8', '2017-06-16'),
  ('9', '2017-07-18'),
  ('10', '2017-08-20');
✓

✓
    update sales
set salesId = case
                when month(salesDate)>=4 then concat(salesId,concat("/",year(salesDate),"-",year(salesDate)+1))
                else
                    concat(salesId,concat("/",year(salesDate)-1,"-",year(salesDate)))
                end
where cast(salesId as unsigned) between "7" and "10";
SELECT *  from sales
salesId      | salesDate 
:----------- | :---------
7/2017-2018  | 2017-05-15
8/2017-2018  | 2017-06-16
9/2017-2018  | 2017-07-18
10/2017-2018 | 2017-08-20
 update sales
set salesId = case
                when month(salesDate)>=4 then concat(SUBSTRING_INDEX(salesId,'/',1),concat("/",year(salesDate),"-",year(salesDate)+1))
                else
                    concat(SUBSTRING_INDEX(salesId,'/',1),concat("/",year(salesDate)-1,"-",year(salesDate)))
                end
where cast(SUBSTRING_INDEX(salesId,'/',1) as unsigned) between "7" and "10";
SELECT *  from sales
salesId      | salesDate 
:----------- | :---------
7/2017-2018  | 2017-05-15
8/2017-2018  | 2017-06-16
9/2017-2018  | 2017-07-18
10/2017-2018 | 2017-08-20

дБ <> скрипка здесь

...