oracle如何计算周,天或日和月的持续时间?

时间:2015-01-05 02:37:24

标签: oracle date oracle11g duration

我一直试图以我的问题的特定格式获取两个日期之间的持续时间。由于我们可以减去,或者如果是几个月,我们可以使用months_between函数,这很容易持续几天。

我需要它在几周和几天内转换..另一个将是几个月和几天..是否有一个功能可以在oracle中执行此操作?我一直在网上搜索,如果有人正在做类似我需要做的事情,但似乎无法找到一个接近的。

有人可以帮我吗?

即时通讯使用oracle 11g。

示例:2014/12/16至2014/12/01之间的范围 2周1天

感谢。

4 个答案:

答案 0 :(得分:0)

将原始天数转换为数周和天数非常简单。只需将总数除以7得到几周,然后计算剩余天数

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    total_days integer;
  3    total_weeks integer;
  4    remaining_days integer;
  5  begin
  6    total_days := date '2014-12-16' - date '2014-12-01';
  7    total_weeks := total_days/ 7;
  8    remaining_days := total_days - total_weeks * 7;
  9    dbms_output.put_line( total_weeks || ' weeks, ' || remaining_days || ' days.' );
 10* end;
SQL> /
2 weeks, 1 days.

PL/SQL procedure successfully completed.

月份和日期有点复杂,因为定义不太明确 - 您必须定义一些规则。例如,months_between在11月30日到12月30日之间的月数返回1.它还会返回11月30日到12月31日之间的月数。这是您想要的结果吗?或者,如果两个日期之间的天数增加,您是否总是希望显示的差异增加?

答案 1 :(得分:0)

你可以尝试这个它可以帮助你,你可以根据你的需要重新排列输出,因为它的显示对我来说不是很清楚参考你的问题,通常我们考虑30天的月份所以我使用鸿沟到了30岁。

create or replace function timediff(fdate date,tdate date) 
return varchar2
as
tot_duration varchar2(25);
begin
    select floor(days/30)||' Month '||floor(mod(days,30)/7)||' Week '
    ||mod(mod(days,30),7)||' Day ' into tot_duration
    from
      (
      select (tdate-fdate) days from dual
      );
return tot_duration;
end;/

调用上述功能: -

select timediff('10.nov.2014','30.dec.2014') duration from dual;

输出结果: -

Duration 
1 Month 2 Week 6 Day 

答案 2 :(得分:0)

SQL中,您可以使用TRUNCROUND来实现这一目标,其逻辑是天数的差异需要除以7以获得周数。

SQL> WITH DATA AS
  2    ( SELECT DATE '2014-12-16' start_dt, DATE '2014-12-01' end_dt FROM dual
  3    )
  4  SELECT TRUNC((start_dt -end_dt)/7)
  5    ||' weeks '
  6    || ROUND(((start_dt -end_dt)/7 - TRUNC((start_dt -end_dt)/7))*7)
  7    || ' days' week_days
  8  FROM DATA
  9  /

WEEK_DAYS
--------------
2 weeks 1 days

SQL>

答案 3 :(得分:0)

此查询为您提供一系列日期的月/周/日:

SELECT trunc(MONTHS_BETWEEN (end_date, start_date)) months, 
floor((end_date - add_months( start_date, trunc(MONTHS_BETWEEN (end_date, start_date)) ))/7) weeks,
mod(end_date - add_months( start_date, trunc(MONTHS_BETWEEN (end_date, start_date)) ),7) days 
      FROM (SELECT TO_DATE ('2014/12/16', 'yyyy/mm/dd') end_date,
                   TO_DATE ('2014/12/01', 'yyyy/mm/dd') start_date
              FROM DUAL);

您也可以根据需要对其进行格式化。例如:

SELECT trunc(MONTHS_BETWEEN (end_date, start_date)) || 'months ' || 
floor((end_date - add_months( start_date, trunc(MONTHS_BETWEEN (end_date, start_date)) ))/7) ||'weeks '||
mod(end_date - add_months( start_date, trunc(MONTHS_BETWEEN (end_date, start_date)) ),7) ||'days' date_values
      FROM (SELECT TO_DATE ('2014/12/16', 'yyyy/mm/dd') end_date ,
                   TO_DATE ('2014/12/01', 'yyyy/mm/dd') start_date
              FROM DUAL);

返回:

DATE_VALUES         
--------------------
0months 2weeks 1days.

我希望这会对你有所帮助。对不起,迟到了。