MySQL中如何为r_238表Answer列的时间数据减去2小时?
没问题,我来帮你搞定这个需求。咱们需要精准识别有效日期时间行,把这些时间减去2小时后更新回去,同时保留值为"NO"的记录不动。以下是具体的代码方案:
解决方案代码示例
基础版本(适用于所有支持STR_TO_DATE的MySQL版本)
这个语句会安全地只处理符合格式的有效时间行,避免转换失败报错:
UPDATE r_238 SET Answer = DATE_FORMAT( DATE_SUB( STR_TO_DATE(Answer, '%Y-%m-%d %h:%i:%s%p'), INTERVAL 2 HOUR ), '%Y-%m-%d %h:%i:%s%p' ) WHERE Answer != 'NO' AND STR_TO_DATE(Answer, '%Y-%m-%d %h:%i:%s%p') IS NOT NULL;
更安全的8.0+版本
如果你的MySQL是8.0及以上,可以用TRY_STR_TO_DATE容错,即使存在少数格式异常的行,也不会导致整个更新中断:
UPDATE r_238 SET Answer = DATE_FORMAT( DATE_SUB( TRY_STR_TO_DATE(Answer, '%Y-%m-%d %h:%i:%s%p'), INTERVAL 2 HOUR ), '%Y-%m-%d %h:%i:%s%p' ) WHERE Answer != 'NO' AND TRY_STR_TO_DATE(Answer, '%Y-%m-%d %h:%i:%s%p') IS NOT NULL;
关键部分解释
STR_TO_DATE(Answer, '%Y-%m-%d %h:%i:%s%p'):把text类型的字符串转换为MySQL可识别的datetime类型,格式符完全匹配你提供的2018-03-06 03:18:17pm格式。DATE_SUB(..., INTERVAL 2 HOUR):对转换后的datetime执行减2小时操作。DATE_FORMAT(..., '%Y-%m-%d %h:%i:%s%p'):把处理后的datetime转回原字符串格式,确保和Answer列的text类型兼容。WHERE条件:精准筛选出需要处理的行,排除"NO"和无法转换为有效时间的记录。
重要提醒
执行更新前一定要先验证结果,可以用下面的SELECT语句预览修改效果:
SELECT Answer AS original_value, DATE_FORMAT( DATE_SUB( STR_TO_DATE(Answer, '%Y-%m-%d %h:%i:%s%p'), INTERVAL 2 HOUR ), '%Y-%m-%d %h:%i:%s%p' ) AS updated_value FROM r_238 WHERE Answer != 'NO' AND STR_TO_DATE(Answer, '%Y-%m-%d %h:%i:%s%p') IS NOT NULL;
内容的提问来源于stack exchange,提问作者ברק רוזנפלד
相关产品推荐
相关产品推荐

