如何用WHERE子句获取过去一年每月首日的数据(TOAD环境)
获取过去一年每月首日数据(无需维护数组)
嘿,你现在的SQL只能拿到当月首日的数据,要扩展到回溯到2017年5月1日的所有月度首日数据,完全不用手动维护数组,用Oracle(适配TOAD环境)的层级查询或者直接日期判断就能搞定,给你两种实用的方案:
方案一:用层级查询生成日期序列再关联
这种方法先自动生成你需要的所有月度首日期,再和业务表关联,逻辑清晰还灵活:
WITH monthly_first_days AS ( SELECT ADD_MONTHS(TO_DATE('05/01/2017', 'MM/DD/YYYY'), LEVEL - 1) AS target_date FROM dual CONNECT BY ADD_MONTHS(TO_DATE('05/01/2017', 'MM/DD/YYYY'), LEVEL - 1) <= TRUNC(SYSDATE, 'MM') ) SELECT s.ARRAY, s.S_DATE FROM SCART.STA_FRAME_STAT s JOIN monthly_first_days m ON s.S_DATE = m.target_date ORDER BY s.S_DATE;
小解释:
monthly_first_days这个临时数据集,用CONNECT BY自动生成从2017-05-01开始的每个月第一天,一直到当前月的首日(TRUNC(SYSDATE, 'MM')就是取当前月第一天)。LEVEL - 1是因为层级查询默认从1开始,减1才能让第一个日期就是你要的起始日。- 之后把生成的日期和你的表关联,就能精准拿到每个月度首日的数据,最后按日期排序方便报表整理。
方案二:直接在WHERE子句里筛选符合条件的日期
如果不想用临时表,直接在查询条件里判断日期是否符合要求也行:
SELECT SCART.STA_FRAME_STAT.ARRAY, SCART.STA_FRAME_STAT.S_DATE FROM SCART.STA_FRAME_STAT WHERE TRUNC(SCART.STA_FRAME_STAT.S_DATE, 'MM') = SCART.STA_FRAME_STAT.S_DATE -- 确定是当月第一天 AND SCART.STA_FRAME_STAT.S_DATE >= TO_DATE('05/01/2017', 'MM/DD/YYYY') -- 起始日期 AND SCART.STA_FRAME_STAT.S_DATE <= TRUNC(SYSDATE, 'MM'); -- 截止到当前月首日 ORDER BY SCART.STA_FRAME_STAT.S_DATE;
注意点:
- 确保你的
S_DATE字段是DATE类型,如果存的是字符串,记得先转成DATE再判断,不然可能有性能问题或者结果不对。 - 在TOAD里直接复制这俩语句,调整起始日期(要是以后需要改的话)就能直接跑,完全不用管数组维护的事儿~
内容的提问来源于stack exchange,提问作者Michael Ryan
相关产品推荐
相关产品推荐

