Дата и квартал SQL ORACLE

В настоящее время я работаю над oracle sql и имею некоторые проблемы с управлением датами и кварталами.

Первое, что я пытаюсь сделать, это дать квартал и год, я хотел бы знать количество дней в квартале. Например, в первом квартале 2013 года было 90 дней, а в 2012 году — 91 день.

Второе, что я хотел бы сделать, это преобразовать дату dd/qq/yyyy в дату dd/mm/yyyy.

Например, 60/2/2013 дает 30/5/2013. Я новичок в Oracle, поэтому любая помощь или имена функций будут высоко оценены.

Спасибо


person Soji    schedule 22.07.2015    source источник


Ответы (2)


Что касается вашего первого вопроса, надеюсь, это даст вам некоторое представление о том, что делать:

with sample_data as (select 2012 yr, 1 quarter from dual union all
                     select 2012 yr, 2 quarter from dual union all
                     select 2012 yr, 3 quarter from dual union all
                     select 2012 yr, 4 quarter from dual union all
                     select 2013 yr, 1 quarter from dual union all
                     select 2013 yr, 2 quarter from dual)
---- end of mimicking a table called "sample_data"; see query below:
select yr,
       quarter,
       add_months(to_date('01/01/'||yr, 'dd/mm/yyyy'), (quarter - 1)*3) qtr_st,
       add_months(to_date('01/01/'||yr, 'dd/mm/yyyy'), quarter * 3) - 1 qtr_end,
       add_months(to_date('01/01/'||yr, 'dd/mm/yyyy'), quarter * 3) - add_months(to_date('01/01/'||yr, 'dd/mm/yyyy'), (quarter - 1)*3) diff
from   sample_data;

        YR    QUARTER QTR_ST     QTR_END          DIFF
---------- ---------- ---------- ---------- ----------
      2012          1 01/01/2012 31/03/2012         91
      2012          2 01/04/2012 30/06/2012         91
      2012          3 01/07/2012 30/09/2012         92
      2012          4 01/10/2012 31/12/2012         92
      2013          1 01/01/2013 31/03/2013         90
      2013          2 01/04/2013 30/06/2013         91

Н.Б. Поскольку вы включаете в подсчет день start_date, разница фактически состоит в том, сколько дней между 1-м кварталом и 1-м числом следующего квартала или qtr_end - qtr_st + 1 из моего запроса выше.

Для вашего второго вопроса, вот один из способов:

with sample_data as (select '60/2/2013' dy_qtr_fmt from dual union all
                     select '60/02/2013' dy_qtr_fmt from dual union all
                     select '01/1/2013' dy_qtr_fmt from dual union all
                     select '1/1/2013' dy_qtr_fmt from dual)
---- end of mimicking a table called "sample_data"; see query below:
select dy_qtr_fmt,
       add_months(year_st, (qtr-1)*3) + num_days_in_qtr - 1 dt
from   (select dy_qtr_fmt,
               to_date('01/01/'||substr(dy_qtr_fmt, -4), 'dd/mm/yyyy') year_st,
               to_number(substr(dy_qtr_fmt, instr(dy_qtr_fmt, '/', 1, 1) + 1, instr(dy_qtr_fmt, '/', 1, 2) - instr(dy_qtr_fmt, '/', 1, 1) -1)) qtr,
               to_number(substr(dy_qtr_fmt, 1, instr(dy_qtr_fmt, '/', 1, 1) - 1)) num_days_in_qtr
        from   sample_data);

DY_QTR_FMT DT        
---------- ----------
60/2/2013  30/05/2013
60/02/2013 30/05/2013
01/1/2013  01/01/2013
1/1/2013   01/01/2013
person Boneist    schedule 22.07.2015

это дает количество дней в текущем квартале, игра с add_months должна позволить вам найти продолжительность других кварталов

select (add_months(trunc(sysdate,'q'),3) - 1) - trunc(sysdate,'q') 
from dual;
person davegreen100    schedule 22.07.2015