如何在Oracle中的两个日期之间取得差异并将其显示为"x年y月z天"

Ish*_*shi 1 sql oracle date

我需要计算Oracle sql中两个日期之间的差异,并按以下格式显示:'x years y months z days'.

现在我看到两种方法来实现这一目标:

第一种方法是在几天内获得差异,然后将其带到'x year y month z days'

第二种方法是使用提取功能提取年,月和日.

在第一个和第二个案例中,我发现如何处理闰年和月份差异的问题为30天而不是31天.

是否有另一种更简单的方法来实现它?

Ale*_*ole 6

作为另一种选择,您可以使用months_between()功能,并操纵赋予您三个部分的值.例如,有一些样本日期:

select months_between(date '2015-03-19', date '2012-01-06') as month_diff
from dual;

MONTH_DIFF
----------
38.4193548
Run Code Online (Sandbox Code Playgroud)

整个月的数量可以分为三个十二倍(即年),剩下两个; 小数部分是基于31天月份的部分月份的天数.

所以你可以用以下方法提取零件:

with t (start_date, end_date) as (
  select date '2012-01-06', date '2015-03-19' from dual
)
select start_date, end_date,
  trunc(month_diff/12) as year_diff,
  trunc(mod(month_diff, 12)) as month_diff,
  31*(month_diff - trunc(month_diff)) as day_diff
from (
  select start_date, end_date,
    months_between(end_date, start_date) as month_diff
  from t
);

START_DATE END_DATE    YEAR_DIFF MONTH_DIFF   DAY_DIFF
---------- ---------- ---------- ---------- ----------
2012-01-06 2015-03-19          3          2         13
Run Code Online (Sandbox Code Playgroud)

然后你可以使用字符串连接来格式化你想要的,例如

select trunc(month_diff/12) || ' years '
  || trunc(mod(month_diff, 12)) || ' months '
  || 31*(month_diff - trunc(month_diff)) || ' days' as diff
from (
...

DIFF                   
------------------------
3 years 2 months 13 days
Run Code Online (Sandbox Code Playgroud)