MySQL查询Movie表闰年影片时出现异常结果,如何修正?
解决闰年查询中出现异常年份数据的问题
哦,这个问题我碰到过好多次——你的查询结果里混进'I 2009'这类异常数据,核心原因是**year列中存在非纯数值的字符串**。MySQL在对字符串执行算术运算(比如%取模)时,会自动尝试把字符串转换为数值:规则是从字符串开头提取连续的数字字符,要是开头没有数字,就直接转换成0。像'I 2009'这种开头是字母的字符串,转换后就是0,而0刚好满足你的闰年判断条件(0%4=0且0%100!=0),所以就被错误筛选出来了。
临时修复:修正查询语句
你可以先在查询里过滤掉非合法的数字年份,再执行闰年判断,有两种常用方式:
方式一:用正则匹配纯4位数字年份
SELECT year, title FROM Movie WHERE year REGEXP '^[0-9]{4}$' -- 确保年份是4位纯数字格式 AND (year % 4 = 0 AND (year % 100 != 0 OR year % 400 = 0));
方式二:用日期函数验证合法性
利用STR_TO_DATE函数,只有符合YYYY格式的字符串才能被转换成日期,否则返回NULL:
SELECT year, title FROM Movie WHERE STR_TO_DATE(year, '%Y') IS NOT NULL -- 验证是否为合法的年份格式 AND (year % 4 = 0 AND (year % 100 != 0 OR year % 400 = 0));
彻底解决:数据清洗与列类型优化
临时查询修复只是权宜之计,根源问题在于year列的数据质量和类型,建议做以下操作:
- 找出所有异常数据:先定位所有不符合4位数字格式的年份记录,方便后续修正或删除:
SELECT year, title FROM Movie WHERE year NOT REGEXP '^[0-9]{4}$';
清理异常数据:根据实际业务逻辑处理这些异常值,比如
'I 2009'可能是输入错误,修正为2009;对于完全无效的记录可以直接删除。修改列数据类型:把
year列从字符串类型(比如VARCHAR)改为INT类型,从根源上避免非数值数据的插入:
ALTER TABLE Movie MODIFY COLUMN year INT;
内容的提问来源于stack exchange,提问作者Shaurya Sheth
相关产品推荐
相关产品推荐

