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