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
3条答案
按热度按时间2cmtqfgy1#
计数并不是解决这个问题的正确工具你的
trunc()
缺少它的左括号,但是BETWEEN
是一个条件而不是函数,所以这也是错误的。甲骨文有the
months_between()
function可以做到这一点;它会给予一个小数值,所以你可以用floor()
来得到完整月份的数量,或者用ceil()
来得到不完整月份的数量:如果要列出月份,则可以使用层次查询或递归子查询因子分解,例如:
而是计算它们:
型
但如果你只想要那个数字,你需要做的工作就太多了
db<>fiddle
mm5n2pyu2#
您的方法是不正确的,最好使用
MONTHS_BETWEEN
,因为它可以处理所有事情,例如,一个月中的不同天数等。可以按如下方式使用
MONTHS_BETWEEN
:4ktjp1zp3#
months_between可能不是所有情况的解决方案;示例:
选择MONTHS_BETWEEN(截止日期('2021 -12- 20','YYYY-MM-DD'),截止日期('2022 -01- 05','YYYY-MM-DD'))FROM二元将得到0.5个月;但实际上DEC和JAN都用于查询和预期结果May 2。
因此,使用上面的例子与函数将提供正确的结果,无论.