MySQL更新DATETIME/TIMESTAMP字段日期部分而保留时间部分的四种方法

 更新时间:2026年06月04日 09:31:33   作者:hefeng_aspnet  
在 MySQL 中,若要更新 DATETIME 或 TIMESTAMP 字段的‌日期部分‌(年月日),同时保持‌时间部分‌(时分秒)不变,主要有以下几种常用且高效的方法,需要的朋友可以参考下

引言

在 MySQL 中,若要更新 DATETIME 或 TIMESTAMP 字段的‌日期部分‌(年月日),同时保持‌时间部分‌(时分秒)不变,主要有以下几种常用且高效的方法。

方法一 使用 ADDTIME + DATE + TIME 函数(推荐)

这是最经典且兼容性最好的写法。其逻辑是:提取原字段的时间部分,将其加到指定的新日期上。

语法结构

UPDATE 表名 
SET 时间字段 = ADDTIME(DATE('指定新日期') + INTERVAL 0 HOUR, TIME(时间字段)) 
WHERE 条件;

示例:‌

假设表名为 orders,字段为 create_time原值为 2023-01-01 14:30:00,想将日期改为 2023-05-20,时间保持 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:确保结果被视为 datetime 类型而非纯 date 类型(在某些 MySQL 版本中必需)。
TIME(create_time):提取原记录中的时分秒部分。
ADDTIME(...):将新日期与原时间相加,得到最终的 datetime。

方法二 使用 CONCAT 字符串拼接

通过字符串拼接的方式,将新的日期字符串与原时间字符串组合,MySQL 会自动将其转换为 DATETIME 类型。

语法结构

UPDATE 表名 
SET 时间字段 = CONCAT('指定新日期', ' ', TIME(时间字段)) 
WHERE 条件;

示例

UPDATE orders 
SET create_time = CONCAT('2023-05-20', ' ', TIME(create_time)) 
WHERE id = 1;

优点:写法直观,易于理解。
注意:确保 '指定新日期' 和 TIME(时间字段) 之间的空格格式正确。

方法三 修改为“当前日期”,时间不变

如果你希望将日期更新为‌今天‌的日期,但保留原来的时间点(例如用于修正数据录入时的日期错误),可以使用 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)

如果只需要修改年份,而月、日、时间都不变,可以使用 DATE_FORMAT 进行格式化重组。

示例:将年份统一改为 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;

注意事项

数据类型‌:上述方法适用于 DATETIME 和 TIMESTAMP 类型。如果是 DATE 类型,本身就没有时间部分,直接赋值即可。

自动更新陷阱‌:如果表中有一个字段定义为 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,当你执行 UPDATE 语句修改其他字段时,该时间字段会‌自动‌变为当前时间。

解决方案‌:如果不想让某个时间字段自动更新,请在建表或改表时去掉 ON UPDATE CURRENT_TIMESTAMP 属性,或者在 UPDATE 语句中显式地给该字段赋原值(如 SET update_time = update_time)。

性能‌:对于大批量数据更新,建议分批执行,避免长时间锁表。

总结

通用推荐‌:ADDTIME(DATE('新日期') + INTERVAL 0 HOUR, TIME(原字段))

简洁写法‌:CONCAT('新日期', ' ', TIME(原字段))

更新为今天‌:将 '新日期' 替换为 CURDATE()

到此这篇关于MySQL更新DATETIME/TIMESTAMP字段日期部分而保留时间部分的四种方法的文章就介绍到这了,更多相关MySQL更新DATETIME字段日期保留时间部分内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 透彻理解Mysql连接的原理

    透彻理解Mysql连接的原理

    这篇文章主要为大家介绍了Mysql连接原理的深入理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • MySQL 优化设置步骤

    MySQL 优化设置步骤

    mysql的一些运行效率等优化设置,建议拥有服务器的朋友,可以测试。
    2009-03-03
  • 如何查询MySQL中某个表的索引信息

    如何查询MySQL中某个表的索引信息

    MySQL是一种关系型数据库管理系统,索引是数据库中非常重要的组成部分,可以帮助提高查询效率,这篇文章主要给大家介绍了关于如何查询MySQL中某个表的索引信息,需要的朋友可以参考下
    2024-08-08
  • MYSQL 删除一个字段前判断字段是否存在的办法

    MYSQL 删除一个字段前判断字段是否存在的办法

    这篇文章主要介绍了MYSQL 删除一个字段前判断字段是否存在的办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-08-08
  • CentOS7环境下源码安装MySQL5.7的方法

    CentOS7环境下源码安装MySQL5.7的方法

    这篇文章主要介绍了CentOS7环境下源码安装MySQL5.7的方法,结合实例形式分析了CentoS7环境下MySQL5.7的下载、编译、安装、设置等相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • MySQL 中的 JSON 查询案例详解

    MySQL 中的 JSON 查询案例详解

    这篇文章主要介绍了MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-04-04
  • PHP版Mysql爆破小脚本

    PHP版Mysql爆破小脚本

    本文给大家分享的是使用php实现暴力破解mysql的小脚本代码,非常的好用,有需要的小伙伴可以参考下
    2016-10-10
  • Mysql树形表的2种查询解决方案(递归与自连接)

    Mysql树形表的2种查询解决方案(递归与自连接)

    MySQL作为一个关系型数据库,存储着许多的数据信息,在实际应用中经常会遇到需要存储树形结构数据的情境,例如部门结构、商品分类等,这篇文章主要给大家介绍了关于Mysql树形表的2种查询解决方案,分别是递归与自连接,需要的朋友可以参考下
    2023-11-11
  • 干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)

    干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)

    这篇文章主要介绍了干掉一堆mysql数据库,仅需这样一个shell脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 搞定mysql行转列的7种方法以及列转行

    搞定mysql行转列的7种方法以及列转行

    在MySQL数据库中,有时候我们需要将一列数据转化为行数据,以便更好地进行数据分析和处理,下面这篇文章主要给大家介绍了关于搞定mysql行转列的7种方法以及列转行的相关资料,需要的朋友可以参考下
    2024-03-03

最新评论