2015-01-05 2 views
0

Я пытался получить продолжительность между двумя датами в конкретном формате моего вопроса. Это было бы легко для продолжительности в днях, поскольку мы можем вычесть или если это будет в течение нескольких месяцев, мы можем использовать функцию months_between.oracle как рассчитать продолжительность в неделях и днях или днях и месяцах?

Мне понадобится конвертировать через несколько недель и дней .. другой будет месяцами и днями .. есть функция, которая может сделать это в оракуле? Я искал онлайн, если кто-то делает что-то похожее, как мне нужно достичь, но не может найти близкого человека.

Может ли кто-нибудь помочь мне в этом?

im использование oracle 11g.

примеры: диапазон между 2014/12/16 и 2014/12/01 является 2weeks 1day

Спасибо.

+0

Пожалуйста, покажите пример того, о чем вы говорите. – OldProgrammer

+0

OldProgrammer, я отредактировал вопрос и добавил пример. Мой пользователь хочет просмотреть его в этом формате, а не просто показывать (дни). – Psychocryo

ответ

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. 

месяцы и дни немного сложнее, потому что это не очень хорошо defined-- вы должны определить ряд правил. Например, months_between возвращает 1 за количество месяцев с 30 ноября по 30 декабря. Он также возвращает 1 за количество месяцев между 30 ноября и 31 декабря. Это результат, который вы хотите? Или вы всегда хотите, чтобы ваша отображаемая разница увеличивалась, если число дней между двумя датами возрастает?

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 
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> 
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. 

Я надеюсь, что это поможет вам. Извини за поздний ответ.

Смежные вопросы