我一直试图以我的问题的特定格式获取两个日期之间的持续时间。由于我们可以减去,或者如果是几个月,我们可以使用months_between
函数,这很容易持续几天。
我需要它在几周和几天内转换..另一个将是几个月和几天..是否有一个功能可以在oracle中执行此操作?我一直在网上搜索,如果有人正在做类似我需要做的事情,但似乎无法找到一个接近的。
有人可以帮我吗?
即时通讯使用oracle 11g。
示例:2014/12/16至2014/12/01之间的范围 2周1天
感谢。
答案 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
中,您可以使用TRUNC
和ROUND
来实现这一目标,其逻辑是天数的差异需要除以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.
我希望这会对你有所帮助。对不起,迟到了。