Oracle使用BETWEEN做日期查询未返回末尾日期数据如何解决
问题根因
- 你使用
TO_DATE('16/06/2021', 'dd/mm/yyyy')生成的日期值默认带的时间是2021-06-16 00:00:00,而BETWEEN是左右闭区间逻辑,所以16日00:00:00之后的所有数据都不在你设定的日期筛选范围内,自然统计不到16日12点到24点的电压数据。 - 补充小问题:部分Oracle版本对时间字符串
'24:00:00'的识别存在兼容隐患,可能导致部分边缘时段数据统计异常。
修复后的查询语句
SELECT TO_CHAR(datadate, 'dd/mm/yyyy'), ROUND(AVG(BATTERYVOLTAGE),2) AVGVOLTAGE FROM MYTABLE WHERE BATTERYVOLTAGE != 0 AND EXTRACT(HOUR FROM datadate) >= 12 AND DATADATE >= TO_DATE('11/06/2021', 'dd/mm/yyyy') AND DATADATE < TO_DATE('17/06/2021', 'dd/mm/yyyy') GROUP BY TO_CHAR(datadate, 'dd/mm/yyyy') ORDER BY 1
说明
- 把日期筛选逻辑从
BETWEEN改为「大于等于起始日期、小于结束日期+1天的零点」,可以完整覆盖16日全天的所有数据,再结合小时>=12的筛选,就能正常统计到16日12点到24点的均值。 - 用
EXTRACT(HOUR FROM datadate) >=12替代字符串比对,兼容性更好,同时避免对日期字段做函数转换后无法走索引的性能问题。
内容的提问来源于stack exchange,提问作者jot
相关产品推荐
相关产品推荐

