SQL日期范围查询用<=运算符仍无法返回指定结束日期的原因是什么?
问题核心诱因
- 日期字段携带时分秒分量,是该问题的最常见诱因。你调用
TO_DATE(:LASTDATE, 'DDMMYYYY')转换参数时,仅传入了日期部分,转换后的日期值为结束日期当天00:00:00。如果B.PLOP_DT_FECHAMENTO字段存储的是带时分秒的完整时间戳(例如2021-09-25 15:22:00),那么该值天然大于结束日期的零点时间,自然不会被<=条件匹配。 - 少数情况为参数传递错误,可检查
:LASTDATE绑定的实际入参是否确实为25092021,没有出现格式传反、日期写错的问题。
修复方案
- 方案1(推荐,不破坏普通索引有效性):将结束日期判断改为小于结束日期+1天,覆盖当天所有时分秒的数据:
WHERE B.PLOP_DT_FECHAMENTO >= TO_DATE(:FRISTDATE, 'DDMMYYYY') AND B.PLOP_DT_FECHAMENTO < TO_DATE(:LASTDATE, 'DDMMYYYY') + 1
- 方案2:对日期字段做截断处理,忽略时分秒再判断:
WHERE B.PLOP_DT_FECHAMENTO >= TO_DATE(:FRISTDATE, 'DDMMYYYY') AND TRUNC(B.PLOP_DT_FECHAMENTO) <= TO_DATE(:LASTDATE, 'DDMMYYYY')
注意:该方案会导致
B.PLOP_DT_FECHAMENTO字段上的普通索引失效,如需走索引需额外建立TRUNC(B.PLOP_DT_FECHAMENTO)的函数索引。
内容的提问来源于stack exchange,提问作者AllPower
相关产品推荐
相关产品推荐

