Как я могу извлечь и отобразить диапазон дат на основе квартала в Oracle?
-
13-12-2019 - |
Вопрос
Я создаю сводную таблицу как часть хранимой процедуры, и у меня есть два столбца.В первом столбце должно быть указано начало, а во втором столбце - конец диапазона дат, который основан на входном параметре, представляющем собой число, обозначающее квартал.Мне удалось извлечь следующее из 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"
.(Это должно гарантировать, что будут включены все данные за последний день квартала.)