如何将星期文本字段转为日期类型?(错误码1411)
问题原因与解决方法
错误原因
str_to_date() 生成合法 DATE 类型值时,必须具备年、月、日的完整信息。你仅传入星期名称(如'Saturday'),缺少核心的日期维度数据,MySQL无法确定具体指向哪一天,因此触发1411错误。%W仅用于匹配星期名称的格式,单独使用不足以生成有效日期。
解决方案
方案1:无需转换为DATE类型(推荐,若仅用于统计/排序)
如果只是需要对星期进行排序或统计,没必要强行转成DATE类型,可新增字段存储星期对应的数字,或直接用函数处理原文本:
-- 新增字段存储星期数字(1=周日,2=周一,……,7=周六) ALTER TABLE toronto_transport ADD COLUMN Day_Num TINYINT; UPDATE toronto_transport SET Day_Num = DAYOFWEEK(str_to_date(Day, "%W"));
方案2:转换为DATE类型(需指定基准日期)
若业务必须要DATE类型字段,需结合一个基准日期来生成具体日期。比如生成当前周对应的目标星期几:
-- 先新增DATE类型字段,避免直接修改原字段导致数据问题 ALTER TABLE toronto_transport ADD COLUMN Day_Date DATE; -- 将文本星期转换为当前周对应的日期 UPDATE toronto_transport SET Day_Date = DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - DAYOFWEEK(str_to_date(Day, "%W"))) DAY);
确认数据无误后,可根据需求删除原Day字段并重命名新字段:
ALTER TABLE toronto_transport DROP COLUMN Day; ALTER TABLE toronto_transport CHANGE COLUMN Day_Date Day DATE;
也可以指定固定基准日期(比如已知'2024-09-07'是周六),生成对应日期:
UPDATE toronto_transport SET Day_Date = DATE_ADD('2024-09-07', INTERVAL (DAYOFWEEK(str_to_date(Day, "%W")) - DAYOFWEEK('2024-09-07')) DAY);
内容的提问来源于stack exchange,提问作者kevin_malone
相关产品推荐
相关产品推荐

