如何获取Oracle中两个日期ID之间的每月计数

时间:2020-01-07 17:38:07

标签: sql oracle

我想获得两个日期之间的每月计数。例如,让我们采用以下范围:

20181202-20190202

此范围将为+1(2018年)和“ 1月”,“ 2月”(2019年)的计数提供+1。

目前,我按月和年进行汇总以获取这些计数,但是我忘记了日期之间相隔1年以上的情况。

查询现在看起来像这样:

    CREATE VIEW V_A_A AS
SELECT CASE WHEN 01>=JT.SUBSTR(START,5,2) AND 01<=JT.SUBSTR(ENDID,1,4) THEN 'JAN'
WHEN 02>=JT.SUBSTR(START,5,2) AND 02<=JT.SUBSTR(ENDID,5,2) THEN 'FEB'
WHEN 03>=JT.SUBSTR(START,5,2) AND 03<=JT.SUBSTR(ENDID,5,2) THEN 'MAR'
WHEN 04>=JT.SUBSTR(START,5,2) AND 04<=JT.SUBSTR(ENDID,5,2) THEN 'APR'
WHEN 05>=JT.SUBSTR(START,5,2) AND 05<=JT.SUBSTR(ENDID,5,2) THEN 'MAY'
WHEN 06>=JT.SUBSTR(START,5,2) AND 06<=JT.SUBSTR(ENDID,5,2) THEN 'JUNE'
WHEN 07>=JT.SUBSTR(START,5,2) AND 07<=JT.SUBSTR(ENDID,5,2) THEN 'JULY'
WHEN 08>=JT.SUBSTR(START,5,2) AND 08<=JT.SUBSTR(ENDID,5,2) THEN 'AUG'
WHEN 09>=JT.SUBSTR(START,5,2) AND 09<=JT.SUBSTR(ENDID,5,2) THEN 'SEPT'
WHEN 10>=JT.SUBSTR(START,5,2) AND 10<=JT.SUBSTR(ENDID,5,2) THEN 'OCT'
WHEN 11>=JT.SUBSTR(START,5,2) AND 11<=JT.SUBSTR(ENDID,5,2) THEN 'NOV'
WHEN 12>=JT.SUBSTR(START,5,2) AND 12<=JT.SUBSTR(ENDID,5,2) THEN 'DEC' ELSE 'N/A' END MONTH
,CASE WHEN 2019>=JT.SUBSTR(START,1,4) AND 2019<=JT.SUBSTR(ENDID,1,4) THEN 2019 
WHEN 2018>=JT.SUBSTR(START,1,4) AND 2018<=JT.SUBSTR(ENDID,1,4) THEN 2018
WHEN 2017>=JT.SUBSTR(START,1,4) AND 2017<=JT.SUBSTR(ENDID,1,4) THEN 2017
WHEN 2016>=JT.SUBSTR(START,1,4) AND 2016<=JT.SUBSTR(ENDID,1,4) THEN 2016
WHEN 2015>=JT.SUBSTR(START,1,4) AND 2015<=JT.SUBSTR(ENDID,1,4) THEN 2015 ELSE 0 END YEAR
,COUNT(*) AS COUNT
from 
(select * from some_db a
INNER JOIN another_db b ON a.field = b.field
WHERE a.name = "Private" JT 
GROUP BY CASE WHEN 2019>=JT.SUBSTR(START,1,4) AND 2019<=JT.SUBSTR(ENDID,1,4) THEN 2019 
WHEN 2018>=JT.SUBSTR(START,1,4) AND 2018<=JT.SUBSTR(ENDID,1,4) THEN 2018
WHEN 2017>=JT.SUBSTR(START,1,4) AND 2017<=JT.SUBSTR(ENDID,1,4) THEN 2017
WHEN 2016>=JT.SUBSTR(START,1,4) AND 2016<=JT.SUBSTR(ENDID,1,4) THEN 2016
WHEN 2015>=JT.SUBSTR(START,1,4) AND 2015<=JT.SUBSTR(ENDID,1,4) THEN 2015 ELSE 0 END,
CASE WHEN 01>=JT.SUBSTR(START,5,2) AND 01<=JT.SUBSTR(ENDID,1,4) THEN 'JAN'
WHEN 02>=JT.SUBSTR(START,5,2) AND 02<=JT.SUBSTR(ENDID,5,2) THEN 'FEB'
WHEN 03>=JT.SUBSTR(START,5,2) AND 03<=JT.SUBSTR(ENDID,5,2) THEN 'MAR'
WHEN 04>=JT.SUBSTR(START,5,2) AND 04<=JT.SUBSTR(ENDID,5,2) THEN 'APR'
WHEN 05>=JT.SUBSTR(START,5,2) AND 05<=JT.SUBSTR(ENDID,5,2) THEN 'MAY'
WHEN 06>=JT.SUBSTR(START,5,2) AND 06<=JT.SUBSTR(ENDID,5,2) THEN 'JUNE'
WHEN 07>=JT.SUBSTR(START,5,2) AND 07<=JT.SUBSTR(ENDID,5,2) THEN 'JULY'
WHEN 08>=JT.SUBSTR(START,5,2) AND 08<=JT.SUBSTR(ENDID,5,2) THEN 'AUG'
WHEN 09>=JT.SUBSTR(START,5,2) AND 09<=JT.SUBSTR(ENDID,5,2) THEN 'SEPT'
WHEN 10>=JT.SUBSTR(START,5,2) AND 10<=JT.SUBSTR(ENDID,5,2) THEN 'OCT'
WHEN 11>=JT.SUBSTR(START,5,2) AND 11<=JT.SUBSTR(ENDID,5,2) THEN 'NOV'
WHEN 12>=JT.SUBSTR(START,5,2) AND 12<=JT.SUBSTR(ENDID,5,2) THEN 'DEC' ELSE 'N/A' END

1 个答案:

答案 0 :(得分:1)

据我了解,您需要整年的边界日期(在这种情况下为2018年至2019年)。因此应该有24行。如果这24个月与边界日期之间的间隔月份相吻合,则您需要计数1,否则为0。因此,请考虑:

.frame(height: ..)

其中SELECT SUBSTR(t1.months,1,4) as "Year", TO_CHAR( TO_DATE(t1.months,'yyyymm'), 'Month' ) as "Month", NVL2(t2.months,1,0) as "Count" FROM ( SELECT y.years||m.months as months FROM ( SELECT DISTINCT TO_CHAR(ADD_MONTHS( TO_DATE('20181202','yyyymmdd') , level - 1 ),'yyyy') as years FROM dual CONNECT BY level <= MONTHS_BETWEEN(TO_DATE('20190202','yyyymmdd'),TO_DATE('20181202','yyyymmdd')) + 1 ) y CROSS JOIN ( SELECT LPAD(LEVEL,2,'0') months FROM dual CONNECT BY level <= 12 ) m ) t1 LEFT JOIN ( SELECT TO_CHAR(ADD_MONTHS( TO_DATE('20181202','yyyymmdd') , level - 1 ),'yyyymm') as months FROM dual CONNECT BY level <= MONTHS_BETWEEN(TO_DATE('20190202','yyyymmdd'),TO_DATE('20181202','yyyymmdd')) + 1 ) t2 ON t1.months = t2.months ORDER BY t1.months ,然后递归CROSS JOIN

Demo