如何将MySQL表中Varchar类型的时间列转换为Time类型?
解决MySQL中Varchar格式时间转Time类型的问题
问题原因
你的数据中Incident_Time是10:37 A这类格式,而STR_TO_DATE的%p格式符要求匹配完整的AM或PM,单个A/P无法被识别,这就是触发错误和返回NULL的核心原因。另外你第二个查询存在语法错误:多余嵌套了SELECT语句且多了分号,导致逻辑失效。
解决步骤
1. 先验证转换逻辑(避免直接更新出错)
先执行查询确认转换结果是否符合预期:
SELECT Incident_Time, STR_TO_DATE( REPLACE(REPLACE(Incident_Time, ' A', ' AM'), ' P', ' PM'), '%h:%i %p' ) AS Time_of_Incident FROM incident_tab_22;
这段代码先用REPLACE把单个A替换为AM、单个P替换为PM,让格式符合%p的匹配要求,再通过STR_TO_DATE转换为标准时间类型。
2. 更新表中数据为标准时间格式
确认转换结果正确后,执行更新语句:
UPDATE incident_tab_22 SET Incident_Time = STR_TO_DATE( REPLACE(REPLACE(Incident_Time, ' A', ' AM'), ' P', ' PM'), '%h:%i %p' );
3. 修改字段类型为Time
数据更新完成后,修改列的存储类型:
ALTER TABLE incident_tab_22 MODIFY COLUMN Incident_Time TIME;
额外注意事项
- 如果数据中存在多空格情况(比如
10:37 A),可以调整REPLACE的匹配字符串,或者先用TRIM(Incident_Time)处理首尾空格后再替换。 - 执行更新操作前建议先备份表数据,防止意外数据丢失。
内容的提问来源于stack exchange,提问作者Lonestar101
相关产品推荐
相关产品推荐

