oracle 获取两个日期之间不同月份的计数

cyvaqqii  于 2022-12-18  发布在  Oracle
关注(0)|答案(3)|浏览(171)

我试图得到两个日期之间不同月份的计数。但是,我得到了一个缺少右括号的错误。和我们中的许多人一样,我喜欢在飞行中使用双表。
这是我的疑问,你能告诉我哪里做错了吗?

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
2cmtqfgy

2cmtqfgy1#

计数并不是解决这个问题的正确工具你的trunc()缺少它的左括号,但是BETWEEN是一个条件而不是函数,所以这也是错误的。
甲骨文有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

mm5n2pyu

mm5n2pyu2#

您的方法是不正确的,最好使用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
4ktjp1zp

4ktjp1zp3#

months_between可能不是所有情况的解决方案;示例:
选择MONTHS_BETWEEN(截止日期('2021 -12- 20','YYYY-MM-DD'),截止日期('2022 -01- 05','YYYY-MM-DD'))FROM二元将得到0.5个月;但实际上DEC和JAN都用于查询和预期结果May 2。
因此,使用上面的例子与函数将提供正确的结果,无论.

相关问题