求助:将CSV中特定日期格式转换为MySQL DATETIME格式
问题描述
CSV数据中In_Time列的日期格式如下:
In_Time 1/1/17 1:07 AM 1/1/17 12:59 PM
将该列以文本格式导入MySQL后,尝试用STR_TO_DATE()函数转换为datetime类型时触发错误:
Incorrect datetime value: '1/1/17 12:27 AM' for function str_to_date
执行的SQL语句:
UPDATE mytable SET In_Time = STR_TO_DATE(ED_Arrival_Time, '%d/%m%y %h: %i: %p');
解决方案
你使用的格式符与实际日期格式不匹配,这是报错的核心原因,调整格式符即可解决:
- 日期部分
1/1/17是「不带前导零的月/日/两位年份」,对应格式符为%c/%e/%y(%c表示无前置零的月份,%e表示无前置零的日期,%y表示两位年份);如果后续数据可能出现带前导零的月/日,也可以用%m/%d/%y,两种格式都兼容你的现有数据。 - 时间部分
1:07 AM的格式符不需要额外冒号,正确写法是%h:%i %p(%h对应12小时制的小时,%i对应分钟,%p对应AM/PM标识)。
另外注意:如果In_Time当前是文本类型,直接更新为datetime值可能出现类型兼容问题,建议先新增一个datetime类型的列,转换完成后再按需替换原列:
-- 新增datetime类型列 ALTER TABLE mytable ADD COLUMN In_Time_Datetime DATETIME; -- 批量转换数据 UPDATE mytable SET In_Time_Datetime = STR_TO_DATE(ED_Arrival_Time, '%c/%e/%y %h:%i %p');
如果已经将In_Time列修改为datetime类型,可直接执行更新:
UPDATE mytable SET In_Time = STR_TO_DATE(ED_Arrival_Time, '%c/%e/%y %h:%i %p');
你可以先执行以下查询验证转换逻辑是否正确:
SELECT STR_TO_DATE('1/1/17 12:27 AM', '%c/%e/%y %h:%i %p') AS converted_time;
内容的提问来源于stack exchange,提问作者cyrus24
相关产品推荐
相关产品推荐

