为何MySQL中STR_TO_DATE函数返回NULL值?SQL新手求助
解决MySQL文本日期转换为日期类型的问题
核心问题分析
你遇到的NULL结果主要来自两个原因:
- 格式匹配符错误:你使用的
'%y-%m-%d %T'对应两位年-月-日+时分秒的格式,和你的实际日期格式dd/mm/yyyy hh:ii完全不匹配。 - 列名含BOM字符:查询语句里的
Date是UTF-8的BOM头字符,导致MySQL无法正确识别列名。
解决步骤
1. 测试日期转换(先验证正确性)
执行以下查询,确认转换结果符合预期:
SELECT STR_TO_DATE(TRIM(LEADING 0xEFBBBF FROM `Date`), '%d/%m/%Y %H:%i') AS converted_date FROM newschema.eth_1h_rev2;
%d:两位数字的日期(01-31)%m:两位数字的月份(01-12)%Y:四位数字的年份(如2024)%H:24小时制的小时(00-23)%i:两位数字的分钟(00-59)TRIM(LEADING 0xEFBBBF FROM \Date``):去除列值前的BOM头字符,确保MySQL能正确读取内容。
2. 永久修改列类型(确认转换无误后执行)
如果测试结果正确,可以修改表结构,将原文本列替换为日期类型:
-- 1. 添加临时列存储转换后的日期值 ALTER TABLE newschema.eth_1h_rev2 ADD COLUMN temp_date DATETIME; -- 2. 将转换后的值写入临时列 UPDATE newschema.eth_1h_rev2 SET temp_date = STR_TO_DATE(TRIM(LEADING 0xEFBBBF FROM `Date`), '%d/%m/%Y %H:%i'); -- 3. 验证数据无误后,删除原列并重命名临时列 ALTER TABLE newschema.eth_1h_rev2 DROP COLUMN `Date`, RENAME COLUMN temp_date TO `Date`;
注意事项
- 执行
UPDATE和ALTER TABLE前,务必备份数据表,避免数据丢失。 - 如果转换后仍有NULL值,说明对应行的原日期文本格式不规范(比如日期超过31、月份超过12等),需要单独排查这些异常行。
内容的提问来源于stack exchange,提问作者sanrio00
相关产品推荐
相关产品推荐

