MySQL多列日期同步更新的五種實現(xiàn)方法
場景痛點:
當(dāng)遇到會員有效期、服務(wù)周期、數(shù)據(jù)版本等需要批量更新日期字段時,如何精準控制日期部分而保留原始時間?今天教你一套DBA都在用的高效解決方案!
一、基礎(chǔ)版 - DATE_ADD函數(shù)法(推薦)
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';
原理:通過計算新舊日期差值,僅修改日期部分
二、進階版 - 時間拼接法(跨時區(qū)場景適用)
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語句實戰(zhàn)
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;
特殊場景:混合處理包含空值的時間字段
四、全表更新加速方案(百萬級數(shù)據(jù)處理)
-- 啟用事務(wù)保證一致性 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 ;
適用場景:需要復(fù)雜業(yè)務(wù)邏輯的周期性更新任務(wù)
高頻問題QA
如何回滾誤操作?
- 提前開啟事務(wù)/Binlog備份
- 使用
SELECT ... INTO OUTFILE
備份原數(shù)據(jù)
時區(qū)差異如何處理?
SET time_zone = '+8:00'; UPDATE ... CONVERT_TZ(create_time,'UTC','Asia/Shanghai')
性能優(yōu)化建議
- WHERE條件必須使用索引字段
- 避免全表掃描(EXPLAIN分析執(zhí)行計劃)
- 凌晨低峰期執(zhí)行大批量操作
到此這篇關(guān)于MySQL多列日期同步更新的五種實現(xiàn)方法的文章就介紹到這了,更多相關(guān)MySQL多列日期同步更新內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Navicat for MySql可視化導(dǎo)入CSV文件
這篇文章主要為大家詳細介紹了Navicat for MySql可視化導(dǎo)入CSV文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05MySQL之MHA高可用配置及故障切換實現(xiàn)詳細部署步驟
這篇文章主要介紹了MySQL之MHA高可用配置及故障切換實現(xiàn)詳細部署步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03mysql5.7.42到mysql8.2.0的升級(rpm方式)
隨著數(shù)據(jù)量的增長和業(yè)務(wù)需求的變更,我們可能需要升級MySQL,本文主要介紹了mysql5.7.42到mysql8.2.0的升級(rpm方式),具有一定的參考價值,感興趣的可以了解一下2024-03-03MySQL曝中間人攻擊Riddle漏洞可致用戶名密碼泄露的處理方法
Riddle漏洞存在于DBMS Oracle MySQL中,攻擊者可以利用漏洞和中間人身份竊取用戶名和密碼。下面小編給大家?guī)砹薓ySQL曝中間人攻擊Riddle漏洞可致用戶名密碼泄露的處理方法,需要的朋友參考下吧2018-01-01詳解MySQL和Redis如何保證數(shù)據(jù)一致性
MySQL與Redis都是常用的數(shù)據(jù)存儲和緩存系統(tǒng),為了提高應(yīng)用程序的性能和可伸縮性,很多應(yīng)用程序?qū)ySQL和Redis一起使用,其中MySQL作為主要的持久存儲,而Redis作為主要的緩存,那么本文就給大家介紹一下MySQL和Redis如何保證數(shù)據(jù)一致性,需要的朋友可以參考下2023-08-08記錄無法安裝mysql-Invalid GPG Key from file:/etc/pki/rpm-gpg/RPM-G
在aliyun上安裝MySQL時由于上次錯誤卸載mysql 導(dǎo)致校驗文件出問題。下面小編給大家分享記錄無法安裝mysql-Invalid GPG Key from file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql的解決方法,需要的朋友參考下吧2017-01-01