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

StackOverflow https://stackoverflow.com//questions/9685244

Вопрос

Я создаю сводную таблицу как часть хранимой процедуры, и у меня есть два столбца.В первом столбце должно быть указано начало, а во втором столбце - конец диапазона дат, который основан на входном параметре, представляющем собой число, обозначающее квартал.Мне удалось извлечь следующее из 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.Будет ли математика здесь учитывать скачкообразные годы?..Я не думаю, что это произойдет, но я не уверен, как с этим справиться.

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

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

Это было полезно?

Решение

Tom Kyte у вас есть ответ: http:// assctom.Orcle.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)
.

Другие советы

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

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 в последний день четверти, если вы хотите, чтобы диапазон был включительно для всех возможных дат в квартале.

Я предлагаю:

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".(Это должно гарантировать, что будут включены все данные за последний день квартала.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top