![](/img/trans.png)
[英]Oracle SQL - get number of days between two dates for a specified month
[英]How to get difference between two dates in Oracle and show it as ' x years y month z days'
我需要计算 Oracle sql 中两个日期之间的差异,并以以下格式显示:'x 年 y 月 z 天'。
现在我看到了两种方法来实现这一点:
第一种方法是获取天数的差异,然后将其带到'x年y月z天'
第二种方法是使用提取 function 提取年、月和日。
在第一种和第二种情况下,我看到了如何处理闰年和 30 天与 31 天的月份差异的问题。
还有另一种更简单的方法来实现吗?
作为另一种选择,您可以使用months_between()
函数,并操纵为您提供三个部分的值。 例如,使用一些示例日期:
select months_between(date '2015-03-19', date '2012-01-06') as month_diff
from dual;
MONTH_DIFF
----------
38.4193548
整月的数目可以分成十二的三个倍数(即年),剩下两个; 小数部分是部分月份的天数,基于 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
然后你可以使用字符串连接来格式化你想要的,例如
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
我只是使用了这个公式,并添加了一些情况,其中 2 个日期之间的 1 天间隔将导致 2 天的差异。
我已经更正了公式:
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,
end_date - add_months(start_date, month_diff) as day_diff
from (
select start_date, end_date,
trunc(months_between(end_date, start_date)) as month_diff
from t
);
Try
SELECT months_between('27-Mar-2021','28-Feb-2021') from dual; Output 9.66
SELECT months_between('28-Mar-2021','28-Feb-2021') from dual; Output 1.0
SELECT months_between('29-Mar-2021','28-Feb-2021') from dual; Output 1.03
SELECT months_between('31-Mar-2021','28-Feb-2021') from dual; Output 1.0
select e.emp_code,e.emp_name,
e.emp_dob,
trunc(months_between(trunc(sysdate),e.emp_dob) / 12) || ' Yrs ' ||
trunc(mod(months_between(trunc(sysdate),e.emp_dob ),12)) || 'Mon. ' ||
(trunc(sysdate) - add_months(e.emp_dob,trunc(months_between(trunc(sysdate),e.emp_dob)))) ||'Dys. ' age
from employee e
WHERE e.emp_date_left IS NULL
ORDER BY 1;
我从这个查询中得到了正确的答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.