You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多条件批量更新MySQL多行数据问题求助

解决VARCHAR类型日期范围更新失效的问题

问题出在VARCHAR类型的日期字符串比较逻辑上:当直接用字符串做BETWEEN比较时,数据库会按字符的ASCII顺序逐位对比。'12-04-2024'的第一个字符是'1',小于'20-03-2024'的第一个字符'2',所以你的条件BETWEEN '20-03-2024' AND '12-04-2024'实际上是一个无效范围(左边界大于右边界),只会匹配比'12-04-2024'大且比'20-03-2024'小的字符串,自然第三行的'12-04-2024'不会被选中。

修正方案:将字符串日期转换为日期类型再比较

需要用数据库对应的日期转换函数,把VARCHAR格式的dd-mm-yyyy字符串转为日期类型,再进行范围判断。以下是主流数据库的实现:

1. MySQL/MariaDB

使用STR_TO_DATE函数解析字符串为日期:

UPDATE mydb_stock.sql_product_sales 
SET sales_price = 7.5
WHERE STR_TO_DATE(invoice_date, '%d-%m-%Y') BETWEEN '2024-03-20' AND '2024-04-12' 
  AND product_name = 'Ball';
  • %d-%m-%Y对应你的日期格式日-月-年
  • 右侧的日期用标准YYYY-MM-DD格式,避免字符串比较问题

2. SQL Server

使用CONVERT函数,格式代码105对应dd-mm-yyyy:

UPDATE mydb_stock.sql_product_sales 
SET sales_price = 7.5
WHERE CONVERT(DATE, invoice_date, 105) BETWEEN '2024-03-20' AND '2024-04-12' 
  AND product_name = 'Ball';

3. Oracle

使用TO_DATE函数指定格式:

UPDATE mydb_stock.sql_product_sales 
SET sales_price = 7.5
WHERE TO_DATE(invoice_date, 'DD-MM-YYYY') BETWEEN TO_DATE('20-03-2024', 'DD-MM-YYYY') AND TO_DATE('12-04-2024', 'DD-MM-YYYY')
  AND product_name = 'Ball';

执行修正后的SQL,就能同时更新第1行和第3行的Ball记录。

内容的提问来源于stack exchange,提问作者Kobby Adom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:27:34