Oracle SQL如何基于Timestamp列筛选近3个月仅登录1次的ID
Oracle SQL 实现方案
实现思路
- 先筛选出时间范围在「当前日期往前推3个月」到当前日期的所有登录记录
- 按ID分组统计每个ID的登录次数
- 筛选分组后登录次数等于1的ID即可
完整SQL代码
SELECT ID FROM 你的表名 WHERE "date" >= ADD_MONTHS(TO_TIMESTAMP('2021-09-28', 'YYYY-MM-DD'), -3) AND "date" <= TO_TIMESTAMP('2021-09-28 23:59:59.999', 'YYYY-MM-DD HH24:MI:SS.FF3') GROUP BY ID HAVING COUNT(*) = 1;
代码说明
- 因为
date是Oracle的关键字,所以列名需要用双引号包裹避免语法报错 ADD_MONTHS(TO_TIMESTAMP('2021-09-28', 'YYYY-MM-DD'), -3)计算得到3个月前的日期,也就是2021-06-28 00:00:00.000,刚好覆盖需求里的近3个月范围- 如果需要直接使用系统当前时间而不是固定的2021-09-28,可以把上面的固定时间替换为
SYSTIMESTAMP,写法如下:
SELECT ID FROM 你的表名 WHERE "date" >= ADD_MONTHS(SYSTIMESTAMP, -3) GROUP BY ID HAVING COUNT(*) = 1;
- 执行后刚好得到预期的ID=11的结果:ID为11的记录里只有2021-07-01的记录在近3个月范围内,6月的记录早于2021-06-28不在统计范围内,所以统计次数为1,符合筛选条件。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

