Как я могу извлечь и отобразить диапазон дат на основе квартала в Oracle? - PullRequest
1 голос
/ 13 марта 2012

Я создаю сводную таблицу как часть хранимой процедуры, и у меня есть два столбца.Первый столбец должен показывать начало, а второй столбец должен показывать конец диапазона дат, который основан на входном параметре, который является числом, обозначающим квартал.Мне удалось извлечь из AskTom следующее, но у меня есть несколько вопросов.

Open C1 FOR
SELECT  ( SELECT TRUNC (SYSDATE, 'Q')-1+1 AS 'StartOf' FROM DUAL ),
SELECT  ( SELECT TRUNC(ADD_MONTHS (SYSDATE, +3), 'Q')-2 AS 'EndOf' FROM DUAL )
FROM DUAL; 

Вопрос 1. Будет ли здесь математика учитывать LeapYears ... Не думаю, что так будет, но я не уверенкак с этим справиться.

Вопрос 2. Как добавить входной параметр 'inQuarter' в качестве конкретного квартала?Я пытался поместить его вместо sysdate, но мне нужно сначала переформатировать его в дату, я думаю?

Заранее спасибо за любые ответы.

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Том Кайт дал вам ответ: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:250288900346075009

Open C1 FOR 
select add_months( dt, (inQuarter-1)*3 ),
       last_day(add_months( dt, (inQuarter-1)*3+2 ) )
from (
  select to_date( inYear || '0101', 'yyyymmdd' ) dt
  from dual)
1 голос
/ 13 марта 2012

Вы можете преобразовать числовой параметр года и числового квартала в DATE

SELECT add_months( trunc( to_date( to_char( <<numeric year>> ),
                                   'YYYY' ),
                          'YYYY' ),
                   3 * <<numeric quarter>> ) first_of_quarter,
       add_months( trunc( to_date( to_char( <<numeric year>> ),
                                   'YYYY' ),
                          'YYYY' ),
                   4 * <<numeric quarter>> ) - 1 last_of_quarter,
  FROM dual

Компонент времени обеих дат будет полуночью в последний день квартала (то есть за 24 часа до начала следующего квартала). Возможно, вы захотите, чтобы последний квартал был 23:59:59 в последний день квартала, если вы хотите, чтобы диапазон включал все возможные даты квартала.

1 голос
/ 13 марта 2012

Я предлагаю:

Open C1 FOR
SELECT TRUNC (d_inQuarter, 'Q') AS "StartOf",
       TRUNC(ADD_MONTHS (d_inQuarter, +3), 'Q') AS "EndOf"
FROM (SELECT add_months(to_date(to_char(i_yr)||'-01-01','YYYY-MM-DD'), (i_q-1)*3)
      AS d_inQuarter FROM DUAL); 

- с целочисленными параметрами i_yr и i_q, представляющими год и квартал соответственно.

Обратите внимание, что EndOf будет представлять полночь в первый день следующего квартала, поэтому любой выбор должен основываться на условиях < "EndOf", а не <= "EndOf".(Это должно гарантировать, что все времена в последний день квартала включены.)

...