我需要计算Oracle sql中两个日期之间的差异,并按以下格式显示:'x years y months z days'.
现在我看到两种方法来实现这一目标:
第一种方法是在几天内获得差异,然后将其带到'x year y month z days'
第二种方法是使用提取功能提取年,月和日.
在第一个和第二个案例中,我发现如何处理闰年和月份差异的问题为30天而不是31天.
是否有另一种更简单的方法来实现它?
作为另一种选择,您可以使用该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)