SQL中STR_TO_DATE结合BETWEEN查询仅返回列名问题排查
问题排查与解决方法
1. 检查REF_DATE字段的数据类型
如果REF_DATE存储的是字符串类型而非日期类型,直接用STR_TO_DATE转换后的日期值进行比较会导致匹配失败。比如字段实际存的是'Jan-1998'或'01/1998',和STR_TO_DATE('jan-98', '%b-%y')生成的1998-01-01日期值无法对应。
解决方法:
先查看字段实际存储格式,再调整匹配逻辑。如果是字符串存储的'Jan-98'格式,可直接用字符串匹配:
SELECT * FROM eecs3311.`18100205` WHERE REF_DATE BETWEEN 'Jan-98' AND 'Feb-99' AND GEO = 'Ontario';
2. 验证STR_TO_DATE的格式与语言环境兼容性
%b代表英文月份缩写(如Jan、Feb),若数据库服务器语言环境非英文,STR_TO_DATE会无法识别'jan-98'这类缩写,返回NULL,导致BETWEEN条件永远不成立。
解决方法:
- 临时将会话语言设置为英文:
SET lc_time_names = 'en_US'; SELECT * FROM eecs3311.`18100205` WHERE REF_DATE BETWEEN STR_TO_DATE('jan-98', '%b-%y') AND STR_TO_DATE('feb-99', '%b-%y') AND GEO = 'Ontario';
- 改用数字月份格式转换:
SELECT * FROM eecs3311.`18100205` WHERE REF_DATE BETWEEN STR_TO_DATE('01-98', '%m-%y') AND STR_TO_DATE('02-99', '%m-%y') AND GEO = 'Ontario';
3. 确认BETWEEN范围是否覆盖目标数据
你的示例需求是查询jan-98至mar-98的数据,但SQL语句里写的是jan-98至feb-99,可先单独查询目标地区的日期取值范围,确认是否存在符合条件的数据:
SELECT DISTINCT REF_DATE FROM eecs3311.`18100205` WHERE GEO = 'Ontario' ORDER BY REF_DATE;
4. 检查日期转换的实际结果
先执行转换语句确认输出是否符合预期,若返回NULL则说明格式或语言环境有问题:
SELECT STR_TO_DATE('jan-98', '%b-%y'), STR_TO_DATE('feb-99', '%b-%y');
内容的提问来源于stack exchange,提问作者Patuqueso
相关产品推荐
相关产品推荐

