在mysql中使用运算符之间的字符串值

Posted

技术标签:

【中文标题】在mysql中使用运算符之间的字符串值【英文标题】:using string values for between operator in mysql 【发布时间】:2020-04-04 17:16:48 【问题描述】:

我有一个表sales,其属性为salesId,salesDate,..etcsalesId 列是varchar。我需要根据salesDatemonth 的条件将salesDateyear 值连接到salesId。我需要为大约 100 个 salesID 执行此操作。 例如:旧的 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

我无法弄清楚错误或如何继续。有人可以提供一些指导吗? 谢谢。 样本数据

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

【问题讨论】:

请提供样本数据和预期结果。目前还不清楚您要在这里完成什么。 【参考方案1】:

我之前遇到的错误实际上是here 所述的警告。因此,在使用更新忽略后,我能够执行查询以获得预期的结果。 但是,我将等待更全面的答案以使其正常工作而无需忽略。 谢谢

【讨论】:

【参考方案2】:

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
销售号 |销售日期 :----------- | :--------- 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
销售号 |销售日期 :----------- | :--------- 7/2017-2018 | 2017-05-15 8/2017-2018 | 2017-06-16 9/2017-2018 | 2017-07-18 10/2017-2018 | 2017-08-20

db小提琴here

【讨论】:

是的,字段 salesId 已经是一个 varchar。我厌倦了你上面的 sn-p 但我仍然得到错误:Error Code: 1292. Truncated incorrect INTEGER value: '1/17-18' 请向我展示您的创建表或制作一个小提琴来演示您的问题,据我所知,您的错误消息显示您的 salesId 是整数而不是正确大小的 Varchar salesID 是 varchar(100) 但是 salesDate 是 date 类型 但是这也给出了正确的结果dbfiddle.uk/… 但不在我的数据库中 您的错误代码显示 1/17-18 不会在您的更新查询中受到影响,请在 sql fiddle 上使用您的实际表进行尝试,看看是否可以重现它,您还可以查看您的mysql版本可以更新,有时很简单

以上是关于在mysql中使用运算符之间的字符串值的主要内容,如果未能解决你的问题,请参考以下文章

运算符之间如何解释字符值? (SQL)

mysql常用运算符和常用函数

mysql的关键字

MySQL数据类型 - JSON数据类型

MySQL 在索引中使用自定义字符串比较运算符

使用 mySQL 运算符 BETWEEN 和经典日期间隔之间有啥区别? [复制]