MySQL更新DATETIME/TIMESTAMP字段日期部分而保留時(shí)間部分的四種方法
引言
在 MySQL 中,若要更新 DATETIME 或 TIMESTAMP 字段的日期部分(年月日),同時(shí)保持時(shí)間部分(時(shí)分秒)不變,主要有以下幾種常用且高效的方法。
方法一 使用 ADDTIME + DATE + TIME 函數(shù)(推薦)
這是最經(jīng)典且兼容性最好的寫法。其邏輯是:提取原字段的時(shí)間部分,將其加到指定的新日期上。
語法結(jié)構(gòu):
UPDATE 表名
SET 時(shí)間字段 = ADDTIME(DATE('指定新日期') + INTERVAL 0 HOUR, TIME(時(shí)間字段))
WHERE 條件;示例:
假設(shè)表名為 orders,字段為 create_time原值為 2023-01-01 14:30:00,想將日期改為 2023-05-20,時(shí)間保持 14:30:00` 不變。
UPDATE orders
SET create_time = ADDTIME(DATE('2023-05-20') + INTERVAL 0 HOUR, TIME(create_time))
WHERE id = 1;DATE('2023-05-20'):獲取指定日期的日期部分。
+ INTERVAL 0 HOUR:確保結(jié)果被視為 datetime 類型而非純 date 類型(在某些 MySQL 版本中必需)。
TIME(create_time):提取原記錄中的時(shí)分秒部分。
ADDTIME(...):將新日期與原時(shí)間相加,得到最終的 datetime。方法二 使用 CONCAT 字符串拼接
通過字符串拼接的方式,將新的日期字符串與原時(shí)間字符串組合,MySQL 會(huì)自動(dòng)將其轉(zhuǎn)換為 DATETIME 類型。
語法結(jié)構(gòu):
UPDATE 表名
SET 時(shí)間字段 = CONCAT('指定新日期', ' ', TIME(時(shí)間字段))
WHERE 條件;示例:
UPDATE orders
SET create_time = CONCAT('2023-05-20', ' ', TIME(create_time))
WHERE id = 1;優(yōu)點(diǎn):寫法直觀,易于理解。
注意:確保 '指定新日期' 和 TIME(時(shí)間字段) 之間的空格格式正確。
方法三 修改為“當(dāng)前日期”,時(shí)間不變
如果你希望將日期更新為今天的日期,但保留原來的時(shí)間點(diǎn)(例如用于修正數(shù)據(jù)錄入時(shí)的日期錯(cuò)誤),可以使用 CURDATE()。
示例:
UPDATE orders SET create_time = ADDTIME(CURDATE() + INTERVAL 0 HOUR, TIME(create_time)) WHERE id = 1;
使用拼接法:
UPDATE orders SET create_time = CONCAT(CURDATE(), ' ', TIME(create_time)) WHERE id = 1;
方法四 僅修改年份或月份(使用 DATE_FORMAT)
如果只需要修改年份,而月、日、時(shí)間都不變,可以使用 DATE_FORMAT 進(jìn)行格式化重組。
示例:將年份統(tǒng)一改為 2024 年
UPDATE orders
SET create_time = STR_TO_DATE(CONCAT('2024-', DATE_FORMAT(create_time, '%m-%d %H:%i:%s')), '%Y-%m-%d %H:%i:%s')
WHERE id = 1;注意事項(xiàng)
數(shù)據(jù)類型:上述方法適用于 DATETIME 和 TIMESTAMP 類型。如果是 DATE 類型,本身就沒有時(shí)間部分,直接賦值即可。
自動(dòng)更新陷阱:如果表中有一個(gè)字段定義為 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,當(dāng)你執(zhí)行 UPDATE 語句修改其他字段時(shí),該時(shí)間字段會(huì)自動(dòng)變?yōu)楫?dāng)前時(shí)間。
解決方案:如果不想讓某個(gè)時(shí)間字段自動(dòng)更新,請(qǐng)?jiān)诮ū砘蚋谋頃r(shí)去掉 ON UPDATE CURRENT_TIMESTAMP 屬性,或者在 UPDATE 語句中顯式地給該字段賦原值(如 SET update_time = update_time)。
性能:對(duì)于大批量數(shù)據(jù)更新,建議分批執(zhí)行,避免長(zhǎng)時(shí)間鎖表。
總結(jié)
通用推薦:ADDTIME(DATE('新日期') + INTERVAL 0 HOUR, TIME(原字段))
簡(jiǎn)潔寫法:CONCAT('新日期', ' ', TIME(原字段))
更新為今天:將 '新日期' 替換為 CURDATE()
到此這篇關(guān)于MySQL更新DATETIME/TIMESTAMP字段日期部分而保留時(shí)間部分的四種方法的文章就介紹到這了,更多相關(guān)MySQL更新DATETIME字段日期保留時(shí)間部分內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你將csv文件導(dǎo)入到mysql數(shù)據(jù)庫(親測(cè)有效)
一直不大懂csv怎么通過mysql圖形化的界面直接導(dǎo)入,看了很多帖,才覺得自己會(huì)了,下面這篇文章主要給大家介紹了關(guān)于將csv文件導(dǎo)入到mysql數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2022-08-08
通用SQL存儲(chǔ)過程分頁以及asp.net后臺(tái)調(diào)用的方法
下面小編就為大家?guī)硪黄ㄓ肧QL存儲(chǔ)過程分頁以及asp.net后臺(tái)調(diào)用的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
探討:sql插入空,默認(rèn)1900-01-01 00:00:00.000的解決方法詳解
本篇文章是對(duì)sql插入空,默認(rèn)1900-01-01 00:00:00.000的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
獲取MySQL表中字段的最長(zhǎng)長(zhǎng)度方式
文章介紹了如何在MySQL中獲取表字段的最大長(zhǎng)度,分為字段定義的最大允許長(zhǎng)度和字段中已存儲(chǔ)數(shù)據(jù)的實(shí)際最大長(zhǎng)度兩種場(chǎng)景,通過查詢系統(tǒng)信息表和使用字符串長(zhǎng)度計(jì)算函數(shù),可以準(zhǔn)確獲取字段的最大長(zhǎng)度,同時(shí)提供了具體的SQL示例和注意事項(xiàng)2026-02-02
MYSQL必知必會(huì)讀書筆記第十和十一章之使用函數(shù)處理數(shù)據(jù)
這篇文章主要介紹了MYSQL必知必會(huì)讀書筆記第十和十一章之使用函數(shù)處理數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2016-05-05
Mysql和SQLServer驅(qū)動(dòng)連接的實(shí)現(xiàn)步驟
本文主要介紹了Mysql和SQL?Server的驅(qū)動(dòng)連接,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
mysql安裝報(bào)錯(cuò)unknown variable mysqlx_port=0.0
本文主要介紹了mysql安裝報(bào)錯(cuò)unknown variable mysqlx_port=0.0,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06

