从两个日期中获取 DISTINCT 月份的 COUNT

Get COUNT of DISTINCT Months From Two Dates

我正在尝试计算两个日期之间不同月份的数量。但是,我收到缺少右括号的错误。与我们中的许多人一样,我喜欢即时使用双 table。

这里是查询。你能告诉我做错了什么吗?

SELECT 
COUNT(DISTINCT(TRUNC BETWEEN TO_DATE('2019-08-01','YYYY-MM-DD') AND TO_DATE('2020-07-07','YYYY-MM-DD'),'MM'))
FROM dual

您的方法不正确,最好使用 MONTHS_BETWEEN,因为它会处理所有事情,即一个月中不同的天数等。

您可以按如下方式使用MONTHS_BETWEEN

SELECT 
MONTHS_BETWEEN (TO_DATE('2020-07-07','YYYY-MM-DD'),TO_DATE('2019-08-01','YYYY-MM-DD'))
FROM dual

计数真的不是正确的工具;您的 trunc() 缺少左括号,但 BETWEEN 是条件而不是函数,所以这也是错误的。

Oracle the months_between() function 可以做到这一点;它会给出一个分数值,因此您可以使用 floor() 获取完整的月份数,或使用 ceil() 获取部分月份的数量:

select
  months_between (date '2020-07-07', date '2019-08-01') as result1,
  floor(months_between (date '2020-07-07', date '2019-08-01')) as result2,
  ceil(months_between (date '2020-07-07', date '2019-08-01')) as result3
from dual;

   RESULT1    RESULT2    RESULT3
---------- ---------- ----------
11.1935484         11         12

如果您想列出月份,那么您可以使用分层查询或递归子查询分解,例如:

with rcte (this_month, last_month) as (
  select trunc(date '2019-08-01', 'MM'), trunc(date '2020-07-07', 'MM')
  from dual
  union all
  select r.this_month + interval '1' month, r.last_month
  from rcte r
  where r.this_month < r.last_month
)
select this_month
from rcte
order by this_month;

THIS_MONTH
----------
2019-08-01
2019-09-01
2019-10-01
...
2020-06-01
2020-07-01

然后计算那些:

with rcte (this_month, last_month) as (
  select trunc(date '2019-08-01', 'MM'), trunc(date '2020-07-07', 'MM')
  from dual
  union all
  select r.this_month + interval '1' month, r.last_month
  from rcte r
  where r.this_month < r.last_month
)
select count(this_month) as result
from rcte;

RESULT
------
    12

但如果您只想要那个数字,那么这比您需要做的工作要多。

db<>fiddle

months_between可能不是所有场景的解决方案;示例:

SELECT MONTHS_BETWEEN (TO_DATE('2021-12-20','YYYY-MM-DD'),TO_DATE('2022-01-05' ,'YYYY-MM-DD')) 来自双 将结果为0.5个月;但实际上 dec 和 jan 都用于查询,预期结果可能为 2.

因此无论如何使用上面的 with 函数示例都会提供正确的结果。