从两个日期中获取 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
但如果您只想要那个数字,那么这比您需要做的工作要多。
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 函数示例都会提供正确的结果。
我正在尝试计算两个日期之间不同月份的数量。但是,我收到缺少右括号的错误。与我们中的许多人一样,我喜欢即时使用双 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
但如果您只想要那个数字,那么这比您需要做的工作要多。
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 函数示例都会提供正确的结果。