如何查询1970至1990年出生用户的姓名与地址,现有SQL无结果如何解决
问题原因及解决方案
核心错误点
- 你使用的
str_to_date参数格式不匹配:指定的解析格式是%m/%d/%Y(斜杠分隔、4位年份),但传入的边界日期用的是逗号分隔的1,1,70,且年份为2位,导致解析结果为NULL,查询条件永远不成立,所以无返回结果。 - 额外校验:如果你的
date_of_birth字段存储的是2位年份,需要把格式符里的%Y改为%y,%Y对应4位年份,%y对应2位年份。
修正后的查询语句
如果date_of_birth是月/日/4位年格式(比如12/25/1980),使用以下语句:
select name, address from user where str_to_date(`date_of_birth`, '%m/%d/%Y') > '1970-01-01' and str_to_date(`date_of_birth`, '%m/%d/%Y') < '1990-01-01'
如果date_of_birth是月/日/2位年格式(比如12/25/80),调整格式符即可:
select name, address from user where str_to_date(`date_of_birth`, '%m/%d/%y') > '1970-01-01' and str_to_date(`date_of_birth`, '%m/%d/%y') < '1990-01-01'
校验&优化建议
- 先执行测试语句确认日期解析是否正常,避免格式不匹配问题:
如果返回的select `date_of_birth`, str_to_date(`date_of_birth`, '%m/%d/%Y') as parsed_date from user limit 10;parsed_date为NULL,说明date_of_birth的实际存储格式和%m/%d/%Y不匹配,调整为对应格式符即可,常见格式还有%Y-%m-%d、%d/%m/%Y等。 - 长期使用建议将
date_of_birth字段改为DATE类型存储,避免每次查询的字符串转日期性能损耗,也能从根源避免格式不匹配的问题。
内容的提问来源于stack exchange,提问作者aemc
相关产品推荐
相关产品推荐

