簡體   English   中英

如何獲取 Oracle 中兩個日期之間的差異並將其顯示為“x 年 y 月 z 天”

[英]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 天的差異。

  • 案例 1:08/04/2019 至 30/04/2021 -> 2 年零 22 天
  • 案例 2:08/04/2019 至 01/05/2021(多一天)-> 2 年零 24 天(多 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM