Oracle查询Varchar类型日期数据返回空表的问题
问题分析与解决方法
问题根源
你的查询返回空表,核心原因是错误地将日期转成字符串后做比较:
字符串比较是按字符顺序逐位对比的,31-12-2021作为字符串会比01-01-2022大(第一位3>0),你的条件相当于找一个既大于大值又小于小值的日期,自然没有符合条件的数据。
正确查询语句
直接将字符串日期转换为日期类型后,按日期逻辑进行比较,不要转成字符串:
SELECT * FROM SD_BDAY WHERE to_date(RECEIVED_DT_KEY, 'DD-MM-YYYY') >= to_date('31-12-2021', 'DD-MM-YYYY') AND to_date(RECEIVED_DT_KEY, 'DD-MM-YYYY') <= to_date('01-01-2022', 'DD-MM-YYYY');
如果想用简洁写法,也可以用BETWEEN:
SELECT * FROM SD_BDAY WHERE to_date(RECEIVED_DT_KEY, 'DD-MM-YYYY') BETWEEN to_date('31-12-2021', 'DD-MM-YYYY') AND to_date('01-01-2022', 'DD-MM-YYYY');
额外建议
- 不要用字符串存储日期,建议将
RECEIVED_DT_KEY列修改为DATE类型(或对应数据库的日期类型),这样查询更高效,还能避免格式转换错误。 - 所有日期比较操作,都要基于日期类型而非字符串类型,确保逻辑正确。
内容的提问来源于stack exchange,提问作者Kaz111
相关产品推荐
相关产品推荐

