在mysql中使用运算符之间的字符串值
Posted
技术标签:
【中文标题】在mysql中使用运算符之间的字符串值【英文标题】:using string values for between operator in mysql 【发布时间】:2020-04-04 17:16:48 【问题描述】:我有一个表sales
,其属性为salesId,salesDate,..etc
。 salesId
列是varchar
。我需要根据salesDate
的month
的条件将salesDate
的year
值连接到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";
销售号 |销售日期 :----------- | :--------- 7/2017-2018 | 2017-05-15 8/2017-2018 | 2017-06-16 9/2017-2018 | 2017-07-18 10/2017-2018 | 2017-08-20SELECT * from sales
✓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";
销售号 |销售日期 :----------- | :--------- 7/2017-2018 | 2017-05-15 8/2017-2018 | 2017-06-16 9/2017-2018 | 2017-07-18 10/2017-2018 | 2017-08-20SELECT * from sales
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中使用运算符之间的字符串值的主要内容,如果未能解决你的问题,请参考以下文章