【问题标题】:using string values for between operator in mysql在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

【问题讨论】:

  • 请提供样本数据和预期结果。目前还不清楚您要在这里完成什么。

标签: mysql casting between


【解决方案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版本可以更新,有时很简单
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2015-04-10
    • 2018-07-20
    相关资源
    最近更新 更多