场景痛点:
当遇到会员有效期、服务周期、数据版本等需要批量更新日期字段时,如何精准控制日期部分而保留原始时间?今天教你一套dba都在用的高效解决方案!
一、基础版 - date_add函数法(推荐)
update user_subscription
set
expire_date = date_add(expire_date, interval datediff('2023-09-01', date(expire_date)) day),
last_renew = date_add(last_renew, interval datediff('2023-09-01', date(last_renew)) day)
where user_type = 'vip';
原理:通过计算新旧日期差值,仅修改日期部分
二、进阶版 - 时间拼接法(跨时区场景适用)
update audit_log
set
start_time = str_to_date(concat('2023-09-01 ', time(start_time)), '%y-%m-%d %h:%i:%s'),
end_time = str_to_date(concat('2023-09-01 ', time(end_time)), '%y-%m-%d %h:%i:%s')
where log_month = 8;
亮点:完美解决日期时间分离需求,特别适合跨天日志处理
三、条件更新法 - case语句实战
update product_schedule
set
manufacture_date = case
when time(manufacture_date) is not null
then concat('2023-q3', ' ', time(manufacture_date))
else '2023-09-01' end,
inspection_date = date_format(now(), '%y-%m-%d') + interval hour(inspection_date) hour
+ interval minute(inspection_date) minute
where factory_id = 1024;
特殊场景:混合处理包含空值的时间字段
四、全表更新加速方案(百万级数据处理)
-- 启用事务保证一致性
start transaction;
-- 分批次更新(每次5万条)
update financial_records
set
value_date = date_format(value_date, '2023-09-01 %h:%i:%s'),
clear_date = date_add(clear_date, interval 2 day)
where id between 1 and 50000;
commit;
性能提示:添加索引字段条件 + 合理分批避免锁表
五、终极技巧 - 存储过程批量处理
delimiter $$
create procedure batch_update_dates(in new_date date)
begin
declare done int default 0;
declare cur_id int;
declare cur cursor for
select id from orders where status = 'pending';
declare continue handler for not found set done = 1;
open cur;
read_loop: loop
fetch cur into cur_id;
if done then
leave read_loop;
end if;
update orders
set
estimate_date = concat(new_date, ' ', time(estimate_date)),
actual_date = date_add(actual_date, interval datediff(new_date, date(actual_date)) day)
where id = cur_id;
end loop;
close cur;
end
$$
delimiter ;
适用场景:需要复杂业务逻辑的周期性更新任务
高频问题qa
如何回滚误操作?
- 提前开启事务/binlog备份
- 使用
select ... into outfile备份原数据
时区差异如何处理?
set time_zone = '+8:00'; update ... convert_tz(create_time,'utc','asia/shanghai')
性能优化建议
- where条件必须使用索引字段
- 避免全表扫描(explain分析执行计划)
- 凌晨低峰期执行大批量操作
到此这篇关于mysql多列日期同步更新的五种实现方法的文章就介绍到这了,更多相关mysql多列日期同步更新内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论