You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL/PHP中如何仅更新DATETIME字段的月和日?

解决MySQL中仅更新DATETIME字段的月日(保留年份和时间)

我刚好处理过类似的需求,给你两种实用的实现方案,都能精准完成只替换DATETIME字段的月日、保留原年份和时间的操作:

方案1:纯SQL语句直接处理

这种方式不用在PHP里额外折腾日期逻辑,直接通过MySQL的日期函数拼接出目标值,效率很高:

核心思路是从原字段upDatum中提取年份和时间部分,再和用户提供日期的月日部分拼接。具体SQL如下:

UPDATE your_table_name
SET upDatum = CONCAT(
    DATE_FORMAT(upDatum, '%Y-'),  -- 提取原日期的年份(比如原日期是2018-01-08...,这里得到"2018-")
    DATE_FORMAT('2017-11-07 00:00:00', '%m-%d '),  -- 提取用户日期的月日(得到"11-07 ",注意后面的空格衔接时间)
    DATE_FORMAT(upDatum, '%H:%i:%s')  -- 提取原日期的时间(得到"00:00:00")
)
WHERE id = 你的记录ID;  -- 务必加上过滤条件!别误更全表

如果用户提供的日期是PHP变量,记得用预处理语句防止SQL注入,示例代码:

// 假设用PDO连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'db_user', 'db_pass');
$userProvidedDate = '2017-11-07 00:00:00';
$targetRecordId = 123; // 你的目标记录ID

$updateStmt = $pdo->prepare("
    UPDATE your_table_name
    SET upDatum = CONCAT(
        DATE_FORMAT(upDatum, '%Y-'),
        DATE_FORMAT(:user_date, '%m-%d '),
        DATE_FORMAT(upDatum, '%H:%i:%s')
    )
    WHERE id = :record_id;
");
$updateStmt->bindParam(':user_date', $userProvidedDate);
$updateStmt->bindParam(':record_id', $targetRecordId);
$updateStmt->execute();

方案2:PHP处理日期后再更新

如果更习惯在PHP里管控日期逻辑,用DateTime类处理会更直观,适合后续可能有更复杂日期操作的场景:

步骤很清晰:先取原日期,替换月日,再存回数据库:

// 1. 从数据库获取原日期值
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'db_user', 'db_pass');
$targetRecordId = 123;

$selectStmt = $pdo->prepare("SELECT upDatum FROM your_table_name WHERE id = :record_id");
$selectStmt->bindParam(':record_id', $targetRecordId);
$selectStmt->execute();
$originalDateStr = $selectStmt->fetchColumn();

// 2. 用DateTime替换月日
$originalDate = new DateTime($originalDateStr);
$userDate = new DateTime('2017-11-07 00:00:00');

// 保留原年份,替换成用户提供的月和日
$originalDate->setDate(
    $originalDate->format('Y'),
    $userDate->format('m'),
    $userDate->format('d')
);
// 时间部分自动保留原字段的值,无需额外处理

// 3. 更新回数据库
$updateStmt = $pdo->prepare("UPDATE your_table_name SET upDatum = :new_date WHERE id = :record_id");
$updateStmt->bindParam(':new_date', $originalDate->format('Y-m-d H:i:s'));
$updateStmt->bindParam(':record_id', $targetRecordId);
$updateStmt->execute();

重要提醒

不管用哪种方案,一定要加WHERE条件,否则会误更新全表的记录;另外生产环境务必用预处理语句,避免SQL注入风险。

内容的提问来源于stack exchange,提问作者Gobbin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:22:26