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
相关产品推荐
相关产品推荐

