查询OTO_HISTORICAL_TRACKING_DETAIL近3月数据返回0结果问题求助
问题原因分析
- 第一个查询的时间范围是「4个月前的当天」到「1个月前的当天」,第二个查询是到「当前日期」能返回结果,说明你的数据集中的有效记录,全部落在「1个月前的当天到当前日期」这个区间里,第一个查询的范围完全没覆盖到这些数据。
- 举个实际例子:假设当前日期是2024-10-20,第一个查询的区间是
2024-06-20到2024-09-20,但你的数据只有2024-09-21到2024-10-20的记录,自然查不到结果。
解决方法
先明确「近3个月」的业务定义,对应不同的查询写法:
场景1:要过去3个完整自然月的数据(不含当前月)
比如当前是10月,要7、8、9月的全部数据,应该把结束时间设为上个月的最后一天,而不是上个月的当天:
SELECT * FROM OTO_HISTORICAL_TRACKING_DETAIL WHERE OTO_START_DATE BETWEEN ADD_MONTHS(CURRENT_DATE, -3) AND LAST_DAY(ADD_MONTHS(CURRENT_DATE, -1))
(比如当前2024-10-20,区间是2024-07-20到2024-09-30,覆盖7、8、9月的所有数据)
场景2:要包含当前月在内的近3个月数据(从3个月前的当天到现在)
这是最常见的「近3个月」需求,直接调整起始时间为ADD_MONTHS(CURRENT_DATE, -3):
SELECT * FROM OTO_HISTORICAL_TRACKING_DETAIL WHERE OTO_START_DATE BETWEEN ADD_MONTHS(CURRENT_DATE, -3) AND CURRENT_DATE
(当前2024-10-20的话,区间是2024-07-20到2024-10-20,包含近3个月的所有数据)
场景3:要过去90天的自然日数据
如果是按自然日计算的90天,用以下写法:
SELECT * FROM OTO_HISTORICAL_TRACKING_DETAIL WHERE OTO_START_DATE >= CURRENT_DATE - INTERVAL '90' DAY
内容的提问来源于stack exchange,提问作者Kartik
相关产品推荐
相关产品推荐

